我知道在 Java 中使用 volatile 关键字我们会得到某种弱同步(它允许可见性更新但不提供实际锁定)。在实现并发程序时,是否有任何情况下 volatile 应优先于实际锁定。SO上有一个有点类似的问题,它说volatile 作为同步机制,但被标记为 C#。
问问题
154 次
3 回答
3
如果共享状态包含在单个字段中,并且您不使用任何 get-and-set 构造(i++
例如)来分配它,那么 volatile 就足够了。不过,大多数 volatile 用法都可以通过使用 AtomicXxx 类型来代替(它提供原子的 get-and-set 操作)。
于 2012-06-30T14:16:10.113 回答
2
简而言之,您应该更愿意在不需要的地方避免使用锁,因为锁会使您的程序陷入死锁,并通过从代码的关键部分排除并发性来降低性能。所以,只要情况允许,就一定要依靠volatile
;如果您还需要像比较和交换这样的原子两步操作,请使用AtomicReference
. 回退到synchronized
仅适用于这是唯一选择的场景。例如,如果你需要延迟初始化一个重对象,你需要锁来防止双重初始化——但同样,不要获取已经初始化的实例(双重检查习惯用法)。
于 2012-06-30T14:26:22.763 回答
0
Volatile 保证所有线程都会看到任何其他线程对变量的最后一次写入,仅此而已。不涉及同步。如果您同步实例变量的读取和写入方法,那么您不必使该变量易失(所有线程都会看到最近的写入)。
于 2012-06-30T17:32:06.403 回答