Java中的volatile关键字
2009-02-21 22:43
288 查看
Java中volatile关键字原义是“不稳定、变化”的意思,那么在java语言中,volatile是什么意思呢?
volatile,在Java中用来修饰变量,那是为什么呢?volatile是告诉vm,这个变量不能被私自占有使用,下面就解释一下为什么这么说吧!
大家都知道,在java中,除了long和double的操作,对基本类型的操作是原子性的,那还为什么使用valotile关键字呢,因为随着jvm的优化和成熟,为了提高多线程的效率,允许每个线程在工作内存保存变量的拷贝进行操作,这就很容易出现数据不一致,所以volatile就强制是多核或多线程必须从主存中读写变量,保证变量的一致性。
由于比起synchronized,volatile关键字的覆盖范伟更小,只是修饰的变量,所以效率就比前者高,但是,它是存在问题的,不能保证“线程写的合理”,解释如下:
写的不合理,是可能存在竞争条件,而出现操作与设想结果不同。
假如,有100个线程正在对一个i变量惊醒i++操作,那么结果一定是100么,可能<100的,比如一个线程a读到的是i=3,几乎同时(a没有修改i),另一个线程也读到3,那么结果,两次相加就得到了i=4,而不是5,详细看看操作系统同步就知道了。
怎么处理呢?
1.使用synchronized关键字,但是这样就失去了volatile的意义。
2.使用CPU原语实现非阻塞算法。详情前看下篇。
volatile,在Java中用来修饰变量,那是为什么呢?volatile是告诉vm,这个变量不能被私自占有使用,下面就解释一下为什么这么说吧!
大家都知道,在java中,除了long和double的操作,对基本类型的操作是原子性的,那还为什么使用valotile关键字呢,因为随着jvm的优化和成熟,为了提高多线程的效率,允许每个线程在工作内存保存变量的拷贝进行操作,这就很容易出现数据不一致,所以volatile就强制是多核或多线程必须从主存中读写变量,保证变量的一致性。
由于比起synchronized,volatile关键字的覆盖范伟更小,只是修饰的变量,所以效率就比前者高,但是,它是存在问题的,不能保证“线程写的合理”,解释如下:
写的不合理,是可能存在竞争条件,而出现操作与设想结果不同。
假如,有100个线程正在对一个i变量惊醒i++操作,那么结果一定是100么,可能<100的,比如一个线程a读到的是i=3,几乎同时(a没有修改i),另一个线程也读到3,那么结果,两次相加就得到了i=4,而不是5,详细看看操作系统同步就知道了。
怎么处理呢?
1.使用synchronized关键字,但是这样就失去了volatile的意义。
2.使用CPU原语实现非阻塞算法。详情前看下篇。
相关文章推荐
- 关于java的volatile关键字吐血总结
- java中的关键字:transient和volatile
- Java Volatile 关键字
- Java volatile关键字
- java volatile关键字
- java 关键字volatile
- java中volatile关键字的含义
- 10049---java-Transient关键字、Volatile关键字介绍和序列化、反序列化机制、单例类序列化
- java中volatile关键字的理解
- Java中的volatile关键字
- java volatile关键字
- 10031---Java并发编程:volatile关键字解析
- Java并发编程:volatile关键字解析
- java中关键字volatile的作用
- Java Volatile transient 关键字
- 详解java中volatile关键字
- Java关键字transient和volatile小结(转)
- Java关键字transient和volatile小结(转)
- JAVA关键字之volatile
- java中volatile关键字的含义