假设我有一个AtomicInteger
值,ai
。在线程T1
中,我这样做:
x = 42 // x is a non-volatile shared integer
ai.lazySet(0);
AFAIK,在另一个帖子中,如果 ai.get()
返回0
,则写入x=42
也会显示。
现在,在另一个线程T2中(运行T1之后),我这样做:
ai.lazySet(1);
此操作后,x=42
的{{1}}设置是否可见?
答案 0 :(得分:2)
我对此的解读是:如果在T2中,ai.get()在调用ai.lazySet(1)之前返回0,则在T2中也可以看到x = 42写入。
这是JMM之前发生的传递性属性。
我认为你不能得到比JMM更强的保证。但是,实际上,真正的JVM可能会做得更好。
答案 1 :(得分:0)
快速修正到上面:lazySet不是JMM的一部分。它是JDK的后期添加,是一个记录的功能,但尚未进入官方JMM。您可以在此处详细了解来自何处:http://psy-lob-saw.blogspot.co.uk/2012/12/atomiclazyset-is-performance-win-for.html
保证在T1之前发生,即在调用lazySet之前由T1进行的任何写操作都将在值0可见时可见,它们无法重新排序。
T2调用lazySet将对T2中的写入提供相同的保证。
无法保证T2何时会看到T1写入的值,反之亦然,尽管在实践中他们会很快看到这些值(或者Doug Lea无论如何都要求)。实际上,实验表明延迟与易失性写入的延迟相似(参见实验和结果的链接)。