当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

多线程中的long和double

发表于: 2012-12-08   作者:aswang   来源:转载   浏览次数:
摘要: 在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。   在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读

在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。

 

在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读操作或写操作分解为2个32位的操作。这样,当在多线程环境中读取一个非volatile的long变量时,可能会出现读取到这个变量一个值的高32位和另一个值的低32位,从而导致数据出问题。

 

这里还需要说明下volatile关键字的作用,可以说有2个作用,其一是,用volatile修饰的变量的读取和写入都是直接操作内存,以保证被其它线程读取到值都是最新的,或者称之为确保内存的可见性;其二是,保证变量的读取和写入操作都是原子操作,就是上面long和double的读取所遇到的问题,注意这里提到的原子性只是针对变量的读取和写入,并不包括对变量的复杂操作,比如i++就无法使用volatile来确保这个操作是原子操作。

 

所以,在多线程环境中,要确保long和double变量的数据正确,可以使用volatile关键字修饰变量,也可以采用同步机制来保证数据的正确性。

 

另外《java并发编程实战》中也讲到了使用volatile的需要满足的所有条件:

a、对变量的写入操作不依赖于变量当前的值,或者你能确保只有单个线程更新变量的值

b、该变量不会与其他状态变量一起纳入不变性条件中

c、在访问变量时不需要加锁

 

参看《java并发编程实战》第三章

多线程中的long和double

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
unsigned int 0~4294967295 int 2147483648~2147483647 unsigned long 0~4294967295 long 214748
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
[cpp] view plain copy #include<iostream> #include<string> #include <limits>
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
#include<iostream> #include<string> #include <limits> using namespace std;
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号