Java volatile变量,多线程

use*_*592 -1 java multithreading

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

Sam*_*Sam 7

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

  • 这个变量的值永远不会被线程本地缓存:所有读写都将直接进入"主存";
  • 对变量的访问就像包含在同步块中一样,自身同步.

换句话说,synchronized和volatile之间的主要区别是:

  • 一个原始变量可以声明为volatile(而你不能在一个带有synchronized的基元上同步);
  • 对volatile变量的访问永远不会阻塞:我们只进行简单的读或写,因此与synchronized块不同,我们永远不会保留任何锁;
  • 因为访问volatile变量永远不会持有锁,所以它不适合我们想要读取update-write作为原子操作的情况(除非我们准备"错过更新");
  • 作为对象引用的volatile变量可能为null(因为您实际上是在引用上同步,而不是实际对象).

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