Java指针是否写入原子?

don*_*ton 16 java multithreading synchronization atomic thread-safety

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

String shared;

thread1()
{
    shared = "a";
}

thread2()
{
    shared = "hello world";
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ein 10

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

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


yai*_*air 7

它是原子的.

但是,在你给出的例子中,shared's值不一定是其中之一null,a或者hello world.如果没有适当的同步,每个线程可能永远不会看到其他线程设置的值.所以thread 1会看到athread 2会看到hello world在同一时间.

编辑:添加最后一段的参考资料以供进一步阅读

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

  • 在这种情况下,我认为不存在"同时"这样的事情.通过同步,它们不会同时发生.没有同步,就没有明确定义的"时间"概念. (2认同)
  • @DavidSchwartz就此事而言,使用"时间"一词,因为它被用于我们世界的任何其他地方.这意味着今天上午9点,`thread 1`处理`shared`与值'a`和'thread 2`将其视为`hello world`.我不认为它比这更简单. (2认同)

Jon*_*eet 5

是的。来自JLS 第 17.7 节

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

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