我的线程类有两个变量var1
和var2
,可以从不同的线程访问。我们可以假设使用var2
通过synchronized
getter和setter与使用volatile
var1
而不使用它们相同吗?
public class Processor extends Thread
{
public volatile boolean var1 = false
private boolean var2 = false
synchronized boolean getVar2 ()
{
return var2;
}
synchronized boolean setVar2 (boolean value)
{
return var2=value;
}
public void run()
{
...
}
}
答案 0 :(得分:2)
在这种情况下是的。因为synchronized块都不会读取和写入值。
假设我们想要对值更改做出反应,这需要读取当前值和写入新值。为此,volatile
不合适:
synchronized void setVar(boolean value) {
if (var != value) {
var = value;
someOnChangeMethod();
}
}
答案 1 :(得分:1)
是的,两者相当于内存可见性。如果你必须做一些检查然后设置,你将失去synchronized
提供的自动性。