繁体   English   中英

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

[英]is a volatile variable synchronized? (java)

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

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

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

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

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

没有任何关系。

基本上

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

实际上没有

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM