在任何情况下我都应该更喜欢'volatile'而不是独占同步吗?

时间:2012-06-30 14:01:32

标签: java multithreading synchronization

我知道在Java中使用volatile关键字我们会得到某种弱同步(它允许可见性更新但不提供实际锁定)。在实现并发程序时,是否存在volatile优先于实际锁定的情况。在SO上有一个类似的问题,即volatile as a synchronization mechanism,但标记为C#。

3 个答案:

答案 0 :(得分:3)

如果共享状态包含在单个字段中,并且您不使用任何get-and-set构造(例如i++)来分配它,那么volatile就足够了。但是,大多数易失性用法可以替换为使用AtomicXxx类型(提供原子获取和设置操作)。

答案 1 :(得分:2)

简而言之,您应该更愿意在任何不需要的地方避免锁定,因为锁会使程序暴露于死锁并通过排除代码关键部分的并发性来阻止性能。因此,只要情况允许,一定要依靠volatile;如果您还需要的是比较和交换等原子两步操作,请使用AtomicReference。仅在这是唯一选项的情况下回退到synchronized。例如,如果你需要懒惰地初始化一个繁重的对象,你需要锁来防止双重初始化 - 但同样,不要获取已经初始化的实例(double-check idiom)。

答案 2 :(得分:0)

Volatile保证所有线程都会看到任何其他线程最后一次写入变量,就是这样。没有涉及同步。如果同步实例变量的读取和写入方法,那么您不必使该变量变为volatile(所有线程都将看到最近的写入)。

相关问题