|
|
1
17
是的,从Java 1.5开始,这段代码是“正确的”。 原子性不是一个问题,无论是否使用volatile(对对象引用的写入都是原子性的),所以无论哪种方式,你都可以将其从关注点列表中划掉——唯一悬而未决的问题是更改的可见性和排序的“正确性”。 对volatile变量的任何写入都会建立“发生在之前”的关系(新Java内存模型的关键概念,如中所述 JSR-133 )以及对同一变量的任何后续读取。这意味着读取线程必须能够看到写入线程可见的所有内容:也就是说,它必须看到所有具有 至少 它们在写入时的“当前”值。 我们可以通过查看以下内容来详细解释这一点 section 17.4.5 of the Java Language Specification ,具体如下要点:
因此,在您的示例中:
这意味着一旦serviceReady为true,您就可以保证“服务”设置正确。 你可以看到一些好的文章使用几乎 确切地 IBM DeveloperWorks --请参阅“挥发性物质的新保证”:
一个在 the JSR-133 FAQ ,由该JSR的作者撰写:
|
|
|
2
2
如果这是正确的代码。
@CPerkins:制造唯一
然而,在这种情况下,一个变量就足够了。为什么需要额外的布尔字段。 例如
鉴于从来没有人调用setService
|
|
|
3
1
你说得对
我推测
|
|
|
4
0
在实践中,它可能会起作用,具体取决于您使用的JVM对volatile的实现。如果通过刷新所有CPU缓存来实现易失性读取,它应该会起作用。但我敢打赌,这不会发生。 Can I force cache coherency on a multicore x86 CPU? 是一本关于这个话题的好书。 我会说,只需为这两个变量设置一个公共锁(java.util.concurrent.lock或synchronized),然后就可以完成了。 这 Java Language Specification, Third Edition ,关于volatile有以下说法:
和
它没有提到其他变量的可见性效应。 |
|
|
Fredericson · 如何避免在Java中使用volatile 8 年前 |
|
|
razorozx · C++如何获取父数据类型的sizeof? 8 年前 |
|
|
JavaKaKida · 单核cpu java中的易失性 8 年前 |
|
|
gstackoverflow · 顺序一致性挥发性解释 8 年前 |
|
|
AlastairG · volatile关键字如何影响静态常量数组? 8 年前 |