[英]is a volatile variable synchronized? (java)
假设我有一个私有变量,并且我有一个synchronized
的setVariable()
方法,它是否与使用volatile
修饰符完全相同?
否。易失性意味着变量不会缓存在任何每线程缓存中,并且在需要时始终从主内存中检索其值。 同步意味着那些每线程缓存将在某些点保持同步。 理论上,如果许多线程需要读取变量的值,那么使用volatile变量会带来很大的速度损失,但它很少被改变。
不,调用synchronized
getXXX / setXXX方法与读/写volatile
变量不同。
多个线程可以同时读取或写入volatile
变量。 但是,一次只有一个线程可以读取或写入由synchronized
块保护的变量。
volatile
变量不同步(至少不synchronized
东西)。 volatile
作用是确保每次使用变量时检索变量(即:它阻止某些类型的优化),以及IIRC以正确的顺序读取和写入变量。 这可以想象地模拟某些类型的同步,但如果你的setter必须设置多个东西,它就不能工作。 (例如,如果设置两个volatile
变量,则会有一个设置一个而另一个不设置的点。)
没有任何关系。
基本上
实际上没有
volatile
实际上是较弱的同步形式,当字段被声明为volatile
,编译器和运行时理解该variable
是共享的,并且对它的操作不应该与其他内存操作重新排序。 易失性变量不会缓存在寄存器或缓存中,而是隐藏在其他处理器中,因此读取volatile
变量始终会返回任何线程的最近写入。
只是一个例子:
First thread run :
while(stopped){
... do something
}
Second thread run :
stopped = true;
将stop作为一个volatile布尔值声明为第一个线程具有一个新的值是有用的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.