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)。
阅读全文
5 0
- 32位JVM对long类型的赋值不是原子性操作
- 证明32位java对long和double的写操作不是原子性的
- 对64位长整形赋值为原子操作
- java中long和double类型操作的非原子性探究
- java中long和double类型操作的非原子性探究
- volatile能保证long&double类型变量操作的原子性
- Java的long、double类型的原子性读取问题
- long和double类型变量的非原子性
- Java中对非原子的64位操作
- java long 类型数据的赋值
- count++不是原子性操作测试
- i++不是原子操作
- i++ 不是原子操作
- JVM中复杂对象的原子操作
- java volatile double、long的原子性
- Long与double操作并不是原子的
- 原子位操作
- 原子位操作
- 2017 ACM/ICPC Asia Regional Qingdao Online--Chinese Zodiac
- POJ2421 Constructing Roads
- ActiveMQ开篇学习笔记
- C语言中的内存分配
- 周末训练笔记(三)
- 32位JVM对long类型的赋值不是原子性操作
- azure 最佳实践 -- 随业务演化的架构
- 计算机原码、反码、补码详解
- 单例模式的写法
- Mac下的myeclipse安装
- 开发中需要注意的问题
- 练习4: 求一个n阶方阵对角线元素之和。
- CSS选择器Selector或选择符学习笔记
- Win10下用Anaconda安装TensorFlow