假设我有一个私有变量,并且我有一个setVariable()
方法synchronized
,是否与使用volatile
修饰符完全相同?
答案 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)
没有任何关系。
基本上