简单的问题:Java 内存/同步模型是否保证原子指针写入?也就是说,如果我们有竞争线程:
String shared;
thread1()
{
shared = "a";
}
thread2()
{
shared = "hello world";
}
同时开始,shared
总是保证是null
, "a"
, 或"hello world"
?
简单的问题:Java 内存/同步模型是否保证原子指针写入?也就是说,如果我们有竞争线程:
String shared;
thread1()
{
shared = "a";
}
thread2()
{
shared = "hello world";
}
同时开始,shared
总是保证是null
, "a"
, 或"hello world"
?
读取和写入对于引用变量是原子的。
来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
它是原子的。
但是,在您给出的示例中,'shared
值不一定是,或之一。如果没有适当的同步,每个线程可能永远不会看到其他线程设置的值。所以会看到,也会同时看到。null
a
hello world
thread 1
a
thread 2
hello world
编辑:为最后一段添加了参考以供进一步阅读
JLS 在第 17 章 - 线程和锁中解释了不同线程执行的操作顺序。具体来说,在17.4.5 Happens-before Order部分。此外,编写良好的Java Concurrency in Practice彻底解释了所有这些。
这将是这三个值之一,是的——但它是未定义的。“胜利”中的最后一个。
您没有问,但为了完整性 - 它不会是“hello wor”或该字符串的某些部分版本。