繁体   English   中英

Java volatile变量,多线程

[英]Java volatile variable, multi threading

我有一个多线程的应用程序。 当多个线程共享该变量时,我注意到一些现有代码使用volatile。 为什么不只在使用变量时在方法中使用同步,将变量定义为volatile有什么好处?

声明一个易失的Java变量意味着:

  • 该变量的值永远不会在线程本地缓存:所有读取和写入操作都将直接进入“主内存”。
  • 对变量的访问就好像它被封装在一个同步块中一样,它本身是同步的。

换句话说,同步和易失性之间的主要区别是:

  • 原始变量可能被声明为volatile(而您不能在已同步的原始变量上进行同步);
  • 对volatile变量的访问永远不会阻塞:我们只做简单的读取或写入操作,因此与同步块不同,我们永远不会保持任何锁;
  • 因为访问易失性变量永远不会持有锁,所以它不适用于我们希望以原子操作方式进行读取-更新-写入的情况(除非我们准备“错过更新”);
  • 作为对象引用的volatile变量可能为null(因为您实际上是在引用上而不是实际对象上进行同步)。

更多信息是: http : //javamex.com/tutorials/synchronization_volatile.shtml

与使用同步相比,volatile更简单,更快捷。

因为它比较简单,所以用途有限,但是如果您只需要volatile,那么为什么要使用同步。 ;)

这里拍摄:

  • 原始变量可能被声明为volatile(而您不能在已同步的原始变量上进行同步);

  • 对volatile变量的访问永远不会被阻塞:我们只做简单的读取或写入操作,因此与同步块不同,我们永远不会保持任何锁。

  • 因为访问易失性变量永远不会持有锁,所以它不适用于我们希望以原子操作方式进行读取-更新-写入的情况(除非我们准备“错过更新”);

  • 作为对象引用的volatile变量可能为null(因为您实际上是在引用而不是实际对象上进行同步)。

简而言之,至少在线程之间共享一个变量(状态)时,才应使用volatile synchronized相比,它的成本less intuitiveless intuitive 有多个变量使状态易变是一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM