Java atomic lazySet

时间:2011-12-01 00:02:10

标签: java atomic

假设我有一个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}}设置是否可见?

2 个答案:

答案 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无论如何都要求)。实际上,实验表明延迟与易失性写入的延迟相似(参见实验和结果的链接)。