什么时候在多线程中使用volatile关键字与同步?
发布于 2012-01-02 15:14:25
使用volatile来保证对变量的每次读访问都将看到写入该变量的最新值。当你需要多条指令的值稳定时,就使用synchronized。(请注意,这并不一定意味着多个语句;单个语句:
var++; // NOT thread safe!即使var声明为volatile,它也不是线程安全的。您需要这样做:
synchronized(LOCK_OBJECT){var++;}有关此问题的详细摘要,请参阅here。
发布于 2012-01-02 15:23:28
易失性仅确保读取操作始终跨线程提供来自内存的最新状态。然而,它不能确保操作的任何写安全性/排序,即两个线程可以以任何随机顺序更新易失性变量。此外,它的不能确保对变量的多个操作是原子的。
但是,同步块可确保最新状态和写入安全性。此外,对变量的访问和更新在同步块中是原子的。然而,上面的情况是真的,只有当所有对相关变量的访问/更新都使用相同的锁对象时,才是真的,这样在任何时候都不会有多个线程访问该变量。
发布于 2012-01-02 15:12:53
这是一个相当宽泛的问题。我能给出的最好的答案是,当执行多个必须被其他线程视为原子发生的操作时,使用synchronized -所有步骤要么都没有发生,要么都没有发生。
对于单个操作,volatile可能就足够了;它充当内存屏障,以确保更改对其他线程的可见性。
https://stackoverflow.com/questions/8698285
复制相似问题