假设我有一个AtomicInteger值,ai。在线程T1中,我需要:
x = 42 // x is a non-volatile shared integer
ai.lazySet(0);在另一个线程中,如果ai.get()返回0,写x=42也是可见的。
现在,在另一个线程T2中(在运行T1之后),我需要:
ai.lazySet(1);此操作之后,是否可以看到从x=42到T1的设置?
发布于 2011-12-01 00:09:46
我对此的理解是:如果在T2中,ai.get()在调用ai.lazySet(1)之前返回0,那么x=42写在T2中也是可见的。
这是发生事件的传递性属性--在JMM之前。
我不认为你能从JMM那里得到比这更有力的保证。然而,在实践中,真正的JVM可能会做得更好。
发布于 2012-12-24 12:00:25
快速更正上面的内容: lazySet不是JMM的一部分。它是JDK的一个后期添加,是一个文档化的特性,但到目前为止还没有进入正式的JMM。您可以阅读更多关于从这里来的信息:http://psy-lob-saw.blogspot.co.uk/2012/12/atomiclazyset-is-performance-win-for.html
对于T1来说,在保证出现之前就会发生这种情况,即T1在调用lazySet之前所做的任何写都是可见的,当值0可见时,它们就不能被重新排序。
T2调用lazySet与用T2编写的写操作具有相同的保证。
T2何时会看到T1编写的值,反之亦然,虽然在实践中,它们会很快地看到值(至少Doug是这么说的),这并不能保证。实际上,实验表明,延迟与易失性写入的延迟类似(请参阅实验和结果的链接)。
https://stackoverflow.com/questions/8334841
复制相似问题