首页 > 编程语言 > 详细

java volatile总结

时间:2015-03-24 23:07:27      阅读:303      评论:0      收藏:0      [点我收藏+]

对一个volatile变量的单个读/写操作,与对一个普通变量的读/写操作使用同一个锁来同步,它们之间的执行效果相同。

volatile的两个作用:
一:保证多线程中的共享变量是始终可见的(但这并不保证votatile引用对象内部属性是完全可见的)
二:防止相关性代码的重排序,从指令级别达到了轻量级锁的目的。
所以volatile提供了一种比锁更轻量级的线程间通信机制。

volatile的特性:
可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

volatile的写-读建立的happens before关系:
对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。

volatile写-读的内存语义:
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。

volatile内存语义的实现:
当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。这个操作之后有普通变量的读写操作,是可以交换顺序的。这个操作之前的指令相互之间是可以被重排序。
当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。这个操作之前有普通变量的读写操作,是可以交换顺序的。这个操作之后的指令相互之间是可以被重排序。
普通变量相互之间是可以重排序的,只要不影响它们之间的语义,但是如果遇到volatile,就需要遵循前两个基本规则。
当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。
两个volatile变量之间无论读写顺序如何都不会重排序。

参考:http://ifeve.com/java-memory-model-4/

技术分享

java volatile总结

原文:http://blog.csdn.net/coslay/article/details/44598833

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!