是一个同步的volatile变量? (Java)的

时间:2011-05-22 16:02:46

标签: java volatile synchronized

假设我有一个私有变量,并且我有一个setVariable()方法synchronized,是否与使用volatile修饰符完全相同?

6 个答案:

答案 0 :(得分:7)

没有。易失性意味着变量不会缓存在任何每线程缓存中,并且在需要时始终从主内存中检索其值。同步意味着那些每线程缓存将在某些点保持同步。理论上,如果许多线程需要读取变量的值,那么使用volatile变量可能会带来很大的速度损失,但它很少被改变。

答案 1 :(得分:4)

不,调用synchronized getXXX / setXXX方法与读取/写入volatile变量不同。

多个线程可以同时读取或写入volatile变量。但是,一次只有一个线程可以读取或写入由synchronized块保护的变量。

答案 2 :(得分:1)

volatile个变量未同步(至少不是synchronized内容同步的方式)。 volatile所做的是确保每次使用变量时检索变量(即:它阻止某些类型的优化),以及IIRC以正确的顺序读取和写入变量。这可以想象地模拟某些类型的同步,但如果你的setter必须设置多个东西,它就不能工作。 (例如,如果设置了两个volatile变量,则会有一个点设置一个而另一个不设置。)

答案 3 :(得分:0)

实际上没有了

volatile实际上是较弱的同步形式,当字段被声明为volatile时,编译器和运行时理解这个variable是共享的,并且对它的操作不应该与其他内存操作重新排序。易失性变量不会缓存在寄存器或缓存中,而是隐藏在其他处理器中,因此读取volatile变量始终会返回任何线程的最近写入。

答案 4 :(得分:0)

只是一个例子:

First thread run  :
while(stopped){
 ... do something
}

Second thread run :
stopped = true;

将stop作为一个volatile布尔值声明为第一个线程具有新的值是有用的。

答案 5 :(得分:0)

没有任何关系。

基本上

  • Volatile =>它总是检索参数的最新值
  • 已同步=>它同时只提供1个线程