您的位置:首页 > 其它

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

2017-09-17 15:53 411 查看
测试代码:

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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  32位 jvm
相关文章推荐