【发布时间】:2011-08-30 15:40:23
【问题描述】:
假设我有一个私有变量,我有一个setVariable() 方法,它是synchronized,是不是和使用volatile 修饰符完全一样?
【问题讨论】:
标签: java volatile synchronized
假设我有一个私有变量,我有一个setVariable() 方法,它是synchronized,是不是和使用volatile 修饰符完全一样?
【问题讨论】:
标签: java volatile synchronized
没有。易失性意味着变量没有缓存在任何每个线程的缓存中,并且它的值总是在需要时从主内存中检索。同步意味着这些每线程缓存将在某些点保持同步。从理论上讲,如果许多线程需要读取变量的值,使用 volatile 变量会带来很大的速度损失,但它很少更改。
【讨论】:
不,调用synchronized getXXX/setXXX 方法与读取/写入volatile 变量不同。
多个线程可以同时读取或写入volatile 变量。但是一次只有一个线程可以读取或写入由synchronized 块保护的变量。
【讨论】:
volatile 变量不同步(至少,不以synchronized 东西同步的方式)。 volatile 所做的是确保每次使用变量时都对其进行检索(即:它阻止某些类型的优化),并确保它以正确的顺序读取和写入。可以想象,这可以模拟某些类型的同步,但如果你的设置器必须设置多个东西,它就不能正常工作。 (例如,如果您设置了两个volatile 变量,则会出现一个设置另一个不设置的点。)
【讨论】:
实际上没有。volatile 实际上是较弱的同步形式,当字段被声明为 volatile 时,编译器和运行时会理解这个 variable 是共享的并且不应该对其进行操作与其他内存操作一起重新排序。易失性变量不会缓存在寄存器或缓存中,它们对其他处理器是隐藏的,因此读取volatile 变量总是返回任何线程最近的写入。
【讨论】:
只是一个例子:
First thread run :
while(stopped){
... do something
}
Second thread run :
stopped = true;
将stopped 声明为可变布尔值对于第一个线程具有新值很有用。
【讨论】:
没有任何关系。
基本上
【讨论】: