java多线程 对另一个变量加上volatile,count++的结果一直是2000,不是会有线程不安全的问题吗

由于count++不是原子操作,多线程会有不安全问题。

flag不加volatile,有两种结果,一种是执行完,输出2000
一种是程序卡住了
flag加上volatile,结果一直是2000,(输出顺序可能有变化)
没有对count加上volatile,为什么线程安全了

java

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockDemo {


    private int count;
    volatile int flag;

     class LockThread extends  Thread{

        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                count++;
            }
            flag+=1;
            System.out.println(flag);
        }
    }

    public static void main(String[] args) {
        LockDemo lockDemo=new LockDemo();
        lockDemo.new LockThread().start();
        lockDemo.new LockThread().start();

        while (!(lockDemo.flag ==2)){}
        System.out.println(lockDemo.count);
    }

}

java

1
2
20000
阅读 1.6k
1 个回答

我把你的代码复制试了下,并不总是1 2 20000的输出顺序,而且每次的count结果都不到20000。

所以肯定是你的几个线程变成顺序执行了。

我又在cpu只有一个核心的虚拟机上试了下,这回每次都是1 2 20000的结果。
所以可能是你的线程只循环1000次,太短了,在一个cpu时间片内就把任务完成了,导致每次看起来都是顺序执行。

我尝试将循环次数加大,直到循环10000000时,终于出现线程安全问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题