这是在视频上看到的一段代码,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关键字不是保证线程共享数据安全么,为什么会出现这种情况。
|