32位JVM对long类型的赋值不是原子性操作

来源:互联网 发布:unity3d 手游开发 编辑:程序博客网 时间:2024/05/17 06:43

测试代码:

public class LongAtomTest implements Runnable {    private static long field = 0;    private volatile long value;    public long getValue() {        return value;    }    public void setValue(long value) {        this.value = value;    }    public LongAtomTest(long value) {        this.setValue(value);    }    @Override    public void run() {        int i = 0;        while (i < 100000) {            LongAtomTest.field = this.getValue();            i++;            long temp = LongAtomTest.field;            if (temp != 1L && temp != -1L) {                System.out.println("出现错误结果" + temp);                System.exit(0);            }        }        System.out.println("运行正确");    }    public static void main(String[] args) throws InterruptedException {        // 获取并打印当前JVM是32位还是64位的        String arch = System.getProperty("sun.arch.data.model");        System.out.println(arch+"-bit");        LongAtomTest t1 = new LongAtomTest(1);        LongAtomTest t2 = new LongAtomTest(-1);        Thread T1 = new Thread(t1);        Thread T2 = new Thread(t2);        T1.start();        T2.start();        T1.join();        T2.join();    }}

32位JVM结果:
这里写图片描述
64位JVM结果:
这里写图片描述
产生原因:

对于32位操作系统来说,单次次操作能处理的最长长度为32bit,而long类型8字节64bit,所以对long的读写都要两条指令才能完成(即每次读写64bit中的32bit)。

原创粉丝点击