Java指针是否写入原子?

时间:2012-06-20 22:14:54

标签: java multithreading synchronization thread-safety atomic

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

String shared;

thread1()
{
    shared = "a";
}

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

同时开始,shared始终保证为null"a""hello world"

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

这是原子的。

但是,在您提供的示例中,shared的值并非{strong>一个 nulla或{ {1}}。如果没有适当的同步,每个线程可能永远不会看到其他线程设置的值。因此hello world会看到thread 1a会同时看到thread 2

修改:添加了最后一段的参考资料以供进一步阅读

JLS解释了Chapter 17 - Threads and Locks中不同线程执行的操作顺序。具体来说,在17.4.5 Happens-before Order部分。另外,写得很好的Java Concurrency in Practice彻底解释了所有这些。

答案 2 :(得分:4)

是。来自section 17.7 of the JLS

  

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

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

答案 3 :(得分:3)

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

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