Java并发编程系列之十一:synchronized(2)
2016-04-03 17:12
856 查看
上一篇文章中提到了synchronized关键字在实现同步方面的作用与原理,其实,除了互斥机制,synchronized还能实现内存可见性——当一个线程修改了对象的状态,其他线程可以看到状态的变化。
关于synchronized的内存可见性做如下说明:
线程B在执行由锁保护的同步代码块时,可以看到线程A对同一个锁保护的同步代码块的操作结果。举个例子,A获取对象M的对象级别锁,并进入代码块,随后释放对象M的对象级别锁,在释放后由线程B获取到了对象M的对象级别锁,那么B就能看到线程A操作的结果,反之,如果线程B在释放锁后,线程A才获取到锁,那么B就不一定能够看到A操作的结果了。
对内存可见性的保证是基于happen-before原则的,任何对锁的获取happen-before于对锁的释放
从内存可见性的角度volatile与锁由相同的语义,写volatile变量相当于退出同步代码块,读volatile变量相当于进入同步代码块
锁机制可以保证原子性和可见性,而volatile只能保证可见性。在需要同步的时候应该优先使用synchronized
当且仅当对变量的写入不依赖当前值以及该变量包含在具有其他变量的不变式(比如i++)的时候才可以使用volatile
关于synchronized的内存可见性做如下说明:
线程B在执行由锁保护的同步代码块时,可以看到线程A对同一个锁保护的同步代码块的操作结果。举个例子,A获取对象M的对象级别锁,并进入代码块,随后释放对象M的对象级别锁,在释放后由线程B获取到了对象M的对象级别锁,那么B就能看到线程A操作的结果,反之,如果线程B在释放锁后,线程A才获取到锁,那么B就不一定能够看到A操作的结果了。
对内存可见性的保证是基于happen-before原则的,任何对锁的获取happen-before于对锁的释放
从内存可见性的角度volatile与锁由相同的语义,写volatile变量相当于退出同步代码块,读volatile变量相当于进入同步代码块
锁机制可以保证原子性和可见性,而volatile只能保证可见性。在需要同步的时候应该优先使用synchronized
当且仅当对变量的写入不依赖当前值以及该变量包含在具有其他变量的不变式(比如i++)的时候才可以使用volatile
相关文章推荐
- jvm(12)-java内存模型与线程
- Java集合---ConcurrentHashMap原理分析
- JAVA中的管道流
- JavaPersistenceWithHibernate第二版笔记Getting started with ORM-002Domain层详解及M etaModel
- Java 大数之大数高精度斐波那契 UVA_10579&&HDU1316 How many Fibs?
- Struts1与Struts2有哪些区别?
- JavaScrapy
- Java并发编程系列之十:synchronized(1)
- 【Java】选择四张花色不同的扑克
- java环境变量配置
- java volatile内存操作细节
- java:类和对象,函数
- Java代码-用牛顿环测透镜曲率半径
- 20145302张薇《Java程序设计》第五周学习总结
- 第六章 springboot + 事务
- Java - 异常
- Java学习之ACM中使用大数类的基础方法及入门教程
- java如何得到GET和POST请求URL和参数列表
- 【Java】豆机
- Java回调机制解析