在百度上查了很多资料,基本都有讲到volatile的用法,可是最可悲的是,除了阻止编译器的优化外,其他的所有用法我都看不懂。。。都讲得太简单了,根据例子中提供的代码完全想不到是不是实现多线程的安全并发的。
不知道有没有大牛能三言两语点破我的困境?
另外关于一次性安全发布(one-time safe publication),我也是查了资料,大概明白了安全发布是保证对象的正确对外输出,但到底什么样的情况会导致不安全的发布还是不懂,能举个例子么? 以及这个例子会造成最直接的后果啥的?
------解决方案--------------------
你知道happen-before不?读、写volatile变量就会触发内存可见性更新,保证你看到最新数据。
------解决方案--------------------
http://www.ticmy.com/?p=5 看完这篇文章 希望你能有点感触。
------解决方案--------------------
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
------解决方案--------------------
就我现在的能力和理解是这样的:
volatile主要用处是在并发情况下,保证每个线程拿到的数据是一致的,也就是说是对加锁,单例的一种更加严格的保证。
在你每次需要这个数据的时候,它都会去内存中取,如果更新了数据,它会实时的更新内存中的数据。
所以就保证了多线程下的数据一致性。如果将变量用volatile修饰,将会告诉jvm,不会保存这个变量的私有本地变量值。
这样导致的结果就是效率会低一点,因为每次都会去比较,都会去重新获取。
这是我的一些个人见解,还不是很透彻,仅供参考,如果楼主有了更加深入的理解,也可以一起交流学习。
------解决方案--------------------
参考《java并发编程实践》
------解决方案--------------------
不想让变量被改变的时候使用!
------解决方案--------------------
我曾经也想模拟出书中提到的各种异常,但是没有几个能复现的。。。