黑马程序员技术交流社区
标题:
volatile关键字保证数据同步出错
[打印本页]
作者:
ehuashao
时间:
2014-3-30 15:06
标题:
volatile关键字保证数据同步出错
这是在视频上看到的一段代码,volatile保证线程共享数据出错,搞不懂啊,贴出来就大神。先写一个线程类。
class UnsafeThread implements Runnable{
private volatile int count =0;
@Override
public void run() {
count++;
}
public int GetCount(){
return count;
}
}
复制代码
上面的代码定义了一个线程类,run方法主要实现共享资源count的自加运算。给count加上了volatile关键字,确保多个线程执行count变量的自驾动作,不会使count变量产生脏数据。
下面模拟多线程的代码:
public static void main(String[] args) throws InterruptedException {
int num=1000;//设置最大循环次数。
int loops =0;//防止程序陷入死循环,设置界限。
//主线程租
ThreadGroup th = Thread.currentThread().getThreadGroup();
while(loops++ < num){
UnsafeThread ut = new UnsafeThread();
for(int i=0;i<num;i++){
new Thread(ut).start();
}
//先等15毫秒,等待活动线程数为1
do{
Thread.sleep(15);
}
while(th.activeCount() != 1);
if(ut.GetCount() != num){
//出现线程不安全的情况
System.out.println("循环到"+loops+"遍,出现线程不安全的情况。");
System.out.println("此时count为:"+ut.GetCount());
}
}
}
复制代码
然后多运行几遍,会发现每次运行都有线程不安全的情况出现。volatile关键字不是保证线程共享数据安全么,为什么会出现这种情况。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2