【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
来源:互联网 发布:赛维网络面试 编辑:程序博客网 时间:2024/05/21 11:34
在http://blog.csdn.net/ns_code/article/details/17288243这篇博文中,讲述了通过同步实现内存可见性的方法,在http://blog.csdn.net/ns_code/article/details/17101369这篇博文中,讲述了通过volatile变量实现内存可见性的方法,这里比较下二者的区别。
1、volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。
2、从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量相当于进入同步代码块。
3、在代码中如果过度依赖volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解。仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它。一般来说,用同步机制会更安全些。
4、加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count = count+1”。
当且仅当满足以下所有条件时,才应该使用volatile变量:
1、对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
2、该变量没有包含在具有其他变量的不变式中。
总结:在需要同步的时候,第一选择应该是synchronized关键字,这是最安全的方式,尝试其他任何方式都是有风险的。尤其在、jdK1.5之后,对synchronized同步机制做了很多优化,如:自适应的自旋锁、锁粗化、锁消除、轻量级锁等,使得它的性能明显有了很大的提升。
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量(r)
- 【Java并发编程】:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- java并发编程(九)--并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 第十五篇:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- Java并发编程之九:实现内存可见性的两种方法比较:synchronized和Volatile
- Java并发编程之volatile变量
- Java实现内存可见性的两种方法比较:synchronized 和 Volatile以及涉及到锁的剖析
- Java并发编程-volatile变量
- Java并发编程-volatile可见性的介绍
- 【Java并发编程】实现多线程的两种方法
- java并发编程之volatile
- java并发编程之volatile
- gem5三级缓存配置,其中L1和L2为cpu独享
- ios中关于delegate(委托)的使用心得
- ubuntu14.04 开启root登陆
- 日经春秋 20150517
- android 测试工具(一)—— Monkey
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【机房收费系统】总结
- 欢迎使用CSDN-markdown编辑器
- 黑马程序员--ios基础--c语言--指针
- 日经社説 20150517 「金メダル庁」では情けない
- HDU 5229 - ZCC loves strings(博弈+概率)
- [好程序员训练营]java基础之抽象类和接口的区别小结
- MFC中MSChart的使用示例
- POJ 3009 Curling 2.0