【问题标题】:When to use volatile vs synchronization in multithreading in java?何时在 java 的多线程中使用 volatile 与同步?
【发布时间】:2012-01-02 07:08:00
【问题描述】:

何时在多线程中使用 volatile 关键字与同步?

【问题讨论】:

标签: java multithreading


【解决方案1】:

使用volatile 保证对变量的每次读取访问都会看到写入该变量的最新值。每当您需要使多个指令的值保持稳定时,请使用 synchronized。 (请注意,这并不一定意味着多个语句;单个语句:

var++; // NOT thread safe!

不是线程安全的,即使 var 被声明为 volatile。你需要这样做:

synchronized(LOCK_OBJECT){var++;}

请参阅here 了解此问题的精彩摘要。

【讨论】:

  • AtomicLong 用一个方法和一个 volatile 字段处理 var++。您可以编辑您的答案以提供更好的示例吗?
  • @Gray - 好的。我的“更好的例子”是var 的类型是float
【解决方案2】:

Volatile 仅确保读取操作始终从内存中跨线程提供最新状态。但是,它不能确保任何写安全/操作顺序,即两个线程可以以任何随机顺序更新 volatile 变量。此外,它确保对变量的多个操作是原子的。

但是,同步块可确保最新状态和写入安全。此外,对变量的访问和更新在同步块内是原子的。 然而,上述情况是正确的,仅当所有对相关变量的访问/更新都使用同一个锁对象,这样多个线程在任何时候都无法访问变量。

【讨论】:

    【解决方案3】:

    这是一个相当广泛的问题。我能给出的最佳答案是在执行多个必须被其他线程视为原子发生的动作时使用synchronized——无论是所有步骤都发生还是没有发生。

    对于单个操作,volatile 可能就足够了;它充当内存屏障,以确保对其他线程的更改可见。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多