首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候在java的多线程中使用volatile和synchronization?

什么时候在java的多线程中使用volatile和synchronization?
EN

Stack Overflow用户
提问于 2012-01-02 15:08:00
回答 3查看 10.6K关注 0票数 15

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-02 15:14:25

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

代码语言:javascript
复制
var++; // NOT thread safe!

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

代码语言:javascript
复制
synchronized(LOCK_OBJECT){var++;}

有关此问题的详细摘要,请参阅here

票数 27
EN

Stack Overflow用户

发布于 2012-01-02 15:23:28

易失性仅确保读取操作始终跨线程提供来自内存的最新状态。然而,它不能确保操作的任何写安全性/排序,即两个线程可以以任何随机顺序更新易失性变量。此外,它的不能确保对变量的多个操作是原子的。

但是,同步块可确保最新状态和写入安全性。此外,对变量的访问和更新在同步块中是原子的。然而,上面的情况是真的,只有当所有对相关变量的访问/更新都使用相同的锁对象时,才是真的,这样在任何时候都不会有多个线程访问该变量。

票数 9
EN

Stack Overflow用户

发布于 2012-01-02 15:12:53

这是一个相当宽泛的问题。我能给出的最好的答案是,当执行多个必须被其他线程视为原子发生的操作时,使用synchronized -所有步骤要么都没有发生,要么都没有发生。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8698285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档