【问题标题】:Are Java pointer writes atomic?Java指针写入是原子的吗?
【发布时间】:2012-06-20 22:14:53
【问题描述】:

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

String shared;

thread1()
{
    shared = "a";
}

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

同时启动,shared 是否始终保证为null"a""hello world"

【问题讨论】:

  • 注意,一般情况下,引用所引用的对象可能没有完全初始化。 String 的正常实现应该没问题,尽管规范在这类事情上不是很好。此外,实际上不可变的类型很少。如果您尝试依赖这类事情,您可能做错了什么(尽管这不是不理解原因的好理由)。

标签: java multithreading synchronization thread-safety atomic


【解决方案1】:

对于引用变量来说,读写是原子的。

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

【讨论】:

    【解决方案2】:

    它是原子的。

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

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

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

    【讨论】:

    • 我认为在这种情况下没有“同时”这样的东西。通过同步,它们不会同时发生。没有同步,就没有明确定义的“时间”概念适用。
    • @DavidSchwartz 就此事而言,“时间”一词的使用与我们世界其他任何地方一样。这意味着在今天上午 9:00,thread 1shared 处理为 athread 2 将其处理为 hello world。我认为没有比这更简单的了。
    • “时间”的使用不适用于没有明确定义的开始或停止且不同步的两个非瞬时事物。例如,如果你想问两个人是否“同时准备工作”,你必须对“准备工作”何时开始有一个精确的定义——按下闹钟上的贪睡按钮是否是“准备工作”的一部分。如果这没有明确定义,那么“同时准备工作”的概念也没有明确定义。在这种情况下,“它们是否同时发生?”没有有用的答案。
    • @DavidSchwartz 你是完全正确的,但是关于一些非常清楚的事情变得哲学化了。这种对“时间”一词的误解,当应用于来自不同线程(由不同 CPU 运行)的读/写操作时,正是我所提到的事实带来的混淆的原因。 必须使用术语“时间”及其广泛使用的定义(或任何相关术语),以实现通常违反直觉的事实。
    • 我不认为有必要说一些虚假或误导性的东西来让某人理解某事。这可能需要更多的努力,但如果你说的是简化但真实的话,最终你会减少混乱。根本没有适用于这类操作的“同时”的连贯概念,假装存在也无济于事。非同步操作之间根本没有定义的顺序。
    【解决方案3】:

    是的。来自section 17.7 of the JLS

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

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

    【讨论】:

    • 作为推论,为什么 Java 的规范要求原子 64 位指针写入,而 long 写入却不一样?
    • @donnyton,引用必须是原子的,我不知道引用/指针不是原子的语言(如果正确对齐)。至于为什么没有将 long 指定为原子的 - 这将包括 32 位架构和原子写入可能更昂贵,而 32 位系统上的引用只是......以及 32 位宽。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多