何时在多线程中使用volatile关键字vs同步?
答案 0 :(得分:25)
使用volatile
保证对变量的每次读访问都会看到写入该变量的最新值。只要您需要为多个指令稳定值,请使用synchronized
。 (请注意,这并不一定意味着多个语句;单个语句:
var++; // NOT thread safe!
即使var
被声明为volatile
,也不是线程安全的。你需要这样做:
synchronized(LOCK_OBJECT){var++;}
有关此问题的详细摘要,请参阅here。
答案 1 :(得分:9)
Volatile仅确保读取操作始终通过线程从内存中提供最新状态。但是,它不能确保任何写操作的安全性/顺序,即两个线程可以以任何随机顺序更新volatile变量。此外,它不确保对变量的多个操作是原子的。
然而,同步块可确保最新的状态和写入安全性。对同步块的访问和更新也是原子的。 但上述情况确实如此, 仅当 所讨论的变量的所有访问/更新都使用相同的锁对象时才能使多个线程在任何时候都无法访问变量
答案 2 :(得分:3)
这是一个非常广泛的问题。我可以给出的最佳答案是在执行多个操作时使用synchronized
,其他线程必须看到它们是原子地发生的 - 要么全部执行,要么都不执行任何步骤。
对于单个操作,volatile
可能就足够了;它充当内存屏障,以确保对其他线程的更改可见性。
答案 3 :(得分:0)
Volatile没有锁定,它使用底层CPU架构来确保写入后所有线程的可见性。