关于java中long的原子性

java的long型和double型的读写应该不是原子的,所以有以下demo:

public class UnatomicLongDemo implements Runnable {
    private static long test = 0;

    private final long val;

    public UnatomicLongDemo(long val) {
        this.val = val;
    }

    @Override
    public void run() {
        while (!Thread.interrupted()) {
            test = val;
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new UnatomicLongDemo(-1));
        Thread t2 = new Thread(new UnatomicLongDemo(0));

        t1.start();
        t2.start();

        long switchVal;
        while ((switchVal = test) == -1 || switchVal == 0) {
        //理论上如果读写不是原子的,那么总会出现此处test前32位和后32位分别来自-1和0的情况,跳出循环
        }
        System.out.println("got it!");
        t1.interrupt();
        t2.interrupt();
    }
}

但是我的代码始终不能走出循环,这是为什么?平台window10 java 1.8

阅读 3.3k
4 个回答

发现我的JDK是64位的,所以对于long double型的读写也是原子的

这叫非原子协定,意思是,JVM不保证他两读写的原子性,是否是原子性得取决于你的平台,比如32位平台上,他就不是原子的。因为总线宽度只有32位,不能一次传输64位的数据啊。

64位数原子的,但不是线程安全的。

规定不要求保证
但是实现可以保证

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