java int short long float double 类型描述以及原子性说明

在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性,其他的都具有原子性。而使用AtomicLong能让long的操作保持原子型。因为代码里面做了封装。

“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。 

错误数据出现的原因是: 
对于long和double变量,把它们作为2个原子性的32位值来对待,而不是一个原子性的64位值, 
这样将一个long型的值保存到内存的时候,可能是2次32位的写操作, 
2个竞争线程想写不同的值到内存的时候,可能导致内存中的值是不正确的结果。

 

1、写入高位32位值(线程2) 
2、写入高位32位值(线程1) 
3、写入低位32位值(线程1)   
4、写入低位32位值(线程2) 

这样内存中的值变成线程1的高32位值和线程2的低32位值的组合,是个错误的值。 
书中还提到,上面出现问题的long和double变量是没有声明为volatile的变量。

因为流行的微处理器还是32bit居多,因此64bit的变量需要拆分成两次,但如果是64bit处理器就能满足64bit变量的原子性操作了。

1、

基本类型:int 二进制位数:32
包装类:java.lang.Integer

最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647  (2的31次方-1)

2、
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768 (-2的15此方)
最大值:Short.MAX_VALUE=32767 (2的15次方-1)

3、
基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)

4、
基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)
最大值:Float.MAX_VALUE=3.4028235E38
 (2的128次方-1)
5、
基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)
最大值:Double.MAX_VALUE=1.7976931348623157E308
 (2的1024次方-1)

你可能感兴趣的:(JAVA语言)