volatile vs AtomicReference 有何区别?
区别就是后者支持CAS,其他都一样。
Java volatile reference vs. AtomicReference
我理解AtomicReference也要加上final或者volatile来保证安全发布。相关讨论:
https://www.baeldung.com/java-atomic-variables
对volatile变量的写是否happen before于对该变量的其他写操作?
java提供的happen before规则中对于volatile的表述是“对volatile变量的写happen before其他读操作”,即“写happen before读”,那么“写happen before写”么?
举个例子,假设有多个线程并发写一个volatile变量,两个写操作之间是否有隔离性(原子性)?会出现类似1.5之前double-check-locking的不一致问题么?
http://tutorials.jenkov.com/java-concurrency/volatile.html
what-happens-if-a-volatile-variable-is-written-from-2-threads
image.png从网文来看,答案是写happen before写。如何理解呢?
直觉上的猜想:假如AB两线程都在写volatile变量,A写的过程中,B线程应该是看不到新值的内存地址(在B看起来,volatile变量一直引用的是旧对象的内存地址),当B能看到(读到)新内存地址的时候,也意味着A已经完成了全部写操作(因为写happen before读规则),后面B再做什么都不至于出现类似1.5前DCL不完全发布的问题了。
原理上的理解,猜测就是每个线程确保自己完成写操作的整个动作之后,才从cache将改动commit到内存,因此多线程之间写volatile变量天然具有隔离性。这只是猜测没去细看。
网友评论