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