【Java并发编程】:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
2015-11-10 14:45
369 查看
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同步机制做了很多优化,如:自适应的自旋锁、锁粗化、锁消除、轻量级锁等,使得它的性能明显有了很大的提升。
2、从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量相当于进入同步代码块。
3、在代码中如果过度依赖volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解。仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它。一般来说,用同步机制会更安全些。
4、加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count
= count+1”。
当且仅当满足以下所有条件时,才应该使用volatile变量:
1、对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
2、该变量没有包含在具有其他变量的不变式中。
总结:在需要同步的时候,第一选择应该是synchronized关键字,这是最安全的方式,尝试其他任何方式都是有风险的。尤其在、jdK1.5之后,对synchronized同步机制做了很多优化,如:自适应的自旋锁、锁粗化、锁消除、轻量级锁等,使得它的性能明显有了很大的提升。
相关文章推荐
- java 图片获取宽高
- java implement
- 关于JDK1.7中LinkedList索引方法的思考
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- 【Java并发编程】:生产者—消费者模型(含代码)
- java 实现利用 RabbitMQ 发送和消费消息
- 【Java并发编程】:深入Java内存模型—内存操作规则总结
- java中map集合嵌套形式简单示例
- 读取Java文件到byte数组的三种方式
- Java中如何遍历Map对象的4种方法
- jjava.lang.UnsupportedClassVersionError: main/Main : Unsupported major.minor version 52.0
- 通过SpringMail API发送邮件
- 【Java并发编程】:并发新特性—Executor框架与线程池(含代码)
- Eclipse使用BlueStacks作为android模拟器
- velocity-tools springboot jar 解决 None of the document roots
- java 遍历map 方法 集合 五种的方法
- Spring4整合Quartz2实现定时任务
- 【Java并发编程】:并发新特性—信号量Semaphore(含代码)
- 【Java并发编程】:并发新特性—障碍器CyclicBarrier(含代码)
- 在JSTL EL中处理java.util.Map,及嵌套List集合