16

简单的问题:Java 内存/同步模型是否保证原子指针写入?也就是说,如果我们有竞争线程:

String shared;

thread1()
{
    shared = "a";
}

thread2()
{
    shared = "hello world";
}

同时开始,shared总是保证是null, "a", 或"hello world"?

4

4 回答 4

10

读取和写入对于引用变量是原子的。

来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

于 2012-06-20T22:18:28.997 回答
7

它是原子的。

但是,在您给出的示例中,'shared值不一定,或之一。如果没有适当的同步,每个线程可能永远不会看到其他线程设置的值。所以会看到,也会同时看到。nullahello worldthread 1athread 2hello world

编辑:为最后一段添加了参考以供进一步阅读

JLS 在第 17 章 - 线程和锁中解释了不同线程执行的操作顺序。具体来说,在17.4.5 Happens-before Order部分。此外,编写良好的Java Concurrency in Practice彻底解释了所有这些。

于 2012-06-20T22:23:08.703 回答
4

是的。从JLS 的第 17.7 节

对引用的写入和读取始终是原子的,无论它们是作为 32 位还是 64 位值实现的。

(这并不意味着您总是会看到“最新”值,但那是另一回事。)

于 2012-06-20T22:19:31.463 回答
3

这将是这三个值之一,是的——但它是未定义的。“胜利”中的最后一个。

您没有问,但为了完整性 - 它不会是“hello wor”或该字符串的某些部分版本。

于 2012-06-20T22:17:14.987 回答