首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java原子lazySet

Java原子lazySet
EN

Stack Overflow用户
提问于 2011-12-01 00:02:09
回答 2查看 377关注 0票数 3

假设我有一个AtomicInteger值,ai。在线程T1中,我需要:

代码语言:javascript
运行
复制
x = 42         // x is a non-volatile shared integer
ai.lazySet(0);

在另一个线程中,如果ai.get()返回0,写x=42也是可见的。

现在,在另一个线程T2中(在运行T1之后),我需要:

代码语言:javascript
运行
复制
ai.lazySet(1);

此操作之后,是否可以看到从x=42T1的设置?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-01 00:09:46

我对此的理解是:如果在T2中,ai.get()在调用ai.lazySet(1)之前返回0,那么x=42写在T2中也是可见的。

这是发生事件的传递性属性--在JMM之前。

我不认为你能从JMM那里得到比这更有力的保证。然而,在实践中,真正的JVM可能会做得更好。

票数 2
EN

Stack Overflow用户

发布于 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是这么说的),这并不能保证。实际上,实验表明,延迟与易失性写入的延迟类似(请参阅实验和结果的链接)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8334841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档