Java并发编程:volatile关键字解析(五.使用volatile关键字的场景)
2016-04-22 15:32
591 查看
synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。
下面列举几个Java中使用volatile的几个场景。
1.状态标记量
2.double check
至于为何需要这么写请参考:
《Java 中的双重检查(Double-Check)》/article/2662479.html
和http://www.iteye.com/topic/652440
参考资料:
《Java编程思想》
《深入理解Java虚拟机》
/article/4139425.html
http://blog.sina.com.cn/s/blog_7bee8dd50101fu8n.html
http://ifeve.com/volatile/
/article/2086904.html
/article/1340004.html
/article/6989353.html
http://www.cppblog.com/elva/archive/2011/01/21/139019.html
http://ifeve.com/volatile-array-visiblity/
http://www.bdqn.cn/news/201312/12579.shtml
/article/7521532.html
/article/4698643.html
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。
下面列举几个Java中使用volatile的几个场景。
1.状态标记量
《Java 中的双重检查(Double-Check)》/article/2662479.html
和http://www.iteye.com/topic/652440
参考资料:
《Java编程思想》
《深入理解Java虚拟机》
/article/4139425.html
http://blog.sina.com.cn/s/blog_7bee8dd50101fu8n.html
http://ifeve.com/volatile/
/article/2086904.html
/article/1340004.html
/article/6989353.html
http://www.cppblog.com/elva/archive/2011/01/21/139019.html
http://ifeve.com/volatile-array-visiblity/
http://www.bdqn.cn/news/201312/12579.shtml
/article/7521532.html
/article/4698643.html
相关文章推荐
- Java排序算法(十)--桶排序
- eclipse使用egit提交代码报错
- Java构造和解析Json数据的两种方法详解二
- JAVA利用axis2发布webservice
- 工作问题-java-单值查询renderJson返回
- JavaWeb之抓包之旅(一)
- spring对事务的控制 AOP
- 利用spring的profile切换不同的环境
- 一个简单的写入文件内容的小demo
- Spring+SpringMVC+Mybatis 跳转流程 :
- java 面向对象基础 UML图 构造方法 对象 参数传值 关联关系 依赖关系
- java“找不到或无法加载主类”及编码错误问题
- java--依赖、关联、聚合和组合之间区别的理解
- java检测乱码原编码
- java整型byte,short,int,long取值范围大小
- java字符串对象的存储机制
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- J2SE(十三)Java之数组
- java排序
- Java千百问_05面向对象(009)_java的多态性都有什么表现