我有一个多线程应用程序。我注意到当变量由多个线程共享时,某些现有代码使用 volatile。为什么在使用变量的时候不直接在方法中使用synchronized呢?将变量定义为volatile有什么好处?
最佳答案
声明一个 volatile Java 变量意味着:
- 该变量的值永远不会在线程本地缓存:所有读取和写入都将直接进入“主内存”;
- 对变量的访问就像将其包含在同步块(synchronized block)中一样,并对其自身进行同步。
换句话来说,synchronized 和 volatile 之间的主要区别是:
- 原始变量可以声明为 volatile(而您无法使用synchronized 对原始变量进行同步);
- 对 volatile 变量的访问永远不会被阻塞:我们只进行简单的读取或写入,因此与同步块(synchronized block)不同,我们永远不会持有任何锁;
- 因为访问 volatile 变量永远不会持有锁,所以它不适合我们希望将读取-更新-写入作为原子操作的情况(除非我们准备“错过更新”);
- 作为对象引用的 volatile 变量可能为 null(因为您实际上是在引用上同步,而不是在实际对象上同步)。
更多信息是:http://javamex.com/tutorials/synchronization_volatile.shtml
关于Java 易失变量、多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275298/