32位JVM对long类型的赋值不是原子性操作
2017-09-17 15:53
411 查看
测试代码:
32位JVM结果:
64位JVM结果:
产生原因:
对于32位操作系统来说,单次次操作能处理的最长长度为32bit,而long类型8字节64bit,所以对long的读写都要两条指令才能完成(即每次读写64bit中的32bit)。
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)。
相关文章推荐
- Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
- 在java中已经规定数据类型是长整形为什么数字后面还要加一个"l"啊?前面不是有long吗?
- 转----Oracle中Clob类型处理解析(NHibernate long值绑定long列,或者是直接oraclecommand的插入的时候报错都可以用,ORA-01461:仅可以插入LONG列的LONG值赋值)
- 在JAVA开发中,当获取到密码字段后,为什么将其优先赋值于char[]类型的实例而不是String 类型的?
- JavaScript的对象,赋值,即用等号赋值如x=y,也想Java类一样(Java基本数据类型不是这样的)是满足“箭头”黄金定律,如果修改x,y的值也随之改变
- Oracle中Clob类型处理解析(NHibernate long值绑定long列,或者是直接oraclecommand的插入的时候报错都能用,ORA-01461:仅可以插入LONG列的LONG值赋值
- java long 类型数据的赋值
- 一个等号是赋值操作,==先转换类型再比较,===先判断类型,如果不是同一类型直接为false。
- Java中float、double、long类型变量赋值添加f、d、L尾缀问题
- ORACLE当遇到“数据大小超出此类型的最大值”和“仅可以为插入 LONG 列的 LONG 值赋值”异常时的解决方法
- Java中long类型直接赋值大数字需要注意的问题
- 32位类型(int、long等)右移(>>)32位
- Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
- Java中float、double、long类型变量赋值添加f、d、L尾缀问题
- 证明在32位hotspot上,long不是原子操作
- Hibernate Tip: 为什么要把变量类型设置为Long, Integer,而不是long, int
- Java中long类型直接赋值出现The literal xxxxxxxxxx of type int is out of range 问题的原因和解决方法
- Java中float、double、long类型变量赋值添加f、d、L尾缀问题
- 证明32位java对long和double的写操作不是原子性的
- 解决eclipse 工具自动将类型long、BigDecimal 赋值为0