Java volatile变量,多线程

时间:2012-02-14 10:29:22

标签: java multithreading

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

4 个答案:

答案 0 :(得分:7)

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

  • 此变量的值永远不会被线程本地缓存:所有读取和写入将直接进入“主存储器”;
  • 对变量的访问就像包含在同步块中一样,自身同步。

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

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

更多信息是: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。比synchronizedless intuitive更便宜。持有状态volatile的多个变量是一个问题。