首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅使用易失性检查并行完成

仅使用易失性检查并行完成
EN

Stack Overflow用户
提问于 2016-12-02 20:26:22
回答 1查看 45关注 0票数 0

考虑以下表示完成两项不同任务的共享标志:

代码语言:javascript
复制
volatile boolean completed1 = false;
volatile boolean completed2 = false;

现在考虑两个线程:

第1条:

代码语言:javascript
复制
completed1 = true;
if (completed1 && completed2) continueSomeOtherStuff();

第2条:

代码语言:javascript
复制
completed2 = true;
if (completed1 && completed2) continueSomeOtherStuff();

continueSomeOtherStuff()至少会被可靠地调用一次吗?

更新:

它在happens-beforehttp://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf中的定义中找到:

  • 线程中的每个操作都会发生--在该线程中的每个后续操作之前。
  • 监视器上的解锁发生在该监视器的每个后续锁之前。
  • 对易失性字段的写入--在以后每次读取该易失性.之前发生。

在最后一句中没有提到线程关系,所以我假设它在所有线程中都是有效的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-04 10:16:16

首先,代码可以简化如下:

No1:

代码语言:javascript
复制
completed1 = true;
if (completed2) continueSomeOtherStuff();

No2:

代码语言:javascript
复制
completed2 = true;
if (completed1) continueSomeOtherStuff();

不改变行为,因为删除的变量只由修改它们的线程读取,所以它们总是正确的。

由于您已经将变量声明为volatile,Java模型保证每个线程立即“看到”其他线程的修改。这意味着所有缓存都必须失效,JVM编译器不允许对这些变量重新排序或优化读取。

因此,在您的示例中,可以保证在continueSomeOtherStuff()方法中至少调用一次。它也可以被调用两次,在罕见的情况下,这两个线程都在两个线程评估条件之前执行了它们的第一个赋值。

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

https://stackoverflow.com/questions/40940318

复制
相关文章

相似问题

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