这看起来像是修脚,但实际上是我对基本假设提出质疑。.:)
在java documentation on synchronised methods中,有以下示例:
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
synchronized
方法上真的需要value
关键字吗?当然这是原子的,并且在其他线程上对相关方法的任何调用之前或之后检索值几乎没有什么不同?满足以下条件即可:public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public int value() {
return c;
}
}
我了解在更复杂的情况下,如果要访问多个私有变量,则是的,这很重要-但是在这种简单情况下,可以安全地假定可以简化吗?
此外,我认为未来的修改可能会导致value方法需要同步并且可能被遗忘,导致bug等风险,因此这可能算是防御性编程,但是我在这里忽略了这一方面。 :)
最佳答案
是的,value()
上确实需要同步。否则,线程可以调用value()
并获得陈旧的答案。
当然这是原子的
对于整数,我相信是这样,但是如果value是long
或double
,则不是。甚至可能只看到字段中的某些位已更新!
在其他线程上对相关方法的任何调用之前或之后检索值几乎没有什么不同?
取决于您的用例。通常它确实很重要。
如果value()
也未同步,则某些静态分析软件(例如FindBugs)会将此代码标记为未正确同步。