我有一个多线程的应用程序。我注意到一些现有代码在多个线程共享变量时使用volatile。为什么不在使用变量时在方法中使用synchronized,将变量定义为volatile的好处是什么?
答案 0 :(得分:7)
声明一个易变的Java变量意味着:
换句话说,synchronized和volatile之间的主要区别是:
更多信息是:http://javamex.com/tutorials/synchronization_volatile.shtml
答案 1 :(得分:1)
volatile比使用synchronized更简单,更快。
因为它更简单,它的用途有限,但如果只需要volatile,为什么要使用synchronized。 ;)
答案 2 :(得分:0)
取自here:
原始变量可以声明为volatile(但你不能 使用synchronized同步基元);
访问volatile 变量永远不会阻止:我们只会做一个 简单的读或写,所以与同步块不同,我们永远不会 坚持任何锁;
因为访问volatile变量永远不会成立 锁,它不适合我们想要的情况 read-update-write作为原子操作(除非我们准备好 “错过更新”);
作为对象引用的volatile变量可以 为null(因为你有效地同步参考, 不是实际的对象)。
答案 3 :(得分:0)
简而言之,我们应该至少在我们在线程之间共享一个变量(状态)时使用volatile
。比synchronized
,less intuitive
更便宜。持有状态volatile的多个变量是一个问题。