【发布时间】:2021-12-27 14:35:33
【问题描述】:
我有一个多线程应用类:
public class A {
private volatile int value = 0; // is volatile needed here?
synchronized public void increment() {
value++; // Atomic is better, agree
}
public int getValue() { // synchronized needed ?
return value;
}
}
【问题讨论】:
-
“需要同步吗?” - 不,除非你让
increment更重并且不想让getValue()在value仍然存在的情况下接触value执行。 “这里需要 volatile 吗?” - 是的,否则getValue()可能会读取缓存的值而不是实际的实际值(阅读发生前发生的情况)。 -
如果值是不稳定的,那么你不需要在'getValue()'上同步。如果你在 'getValue()' 上使用同步,那么你不需要 volatile,因为你所有的访问都是通过同步方法。
-
@Zabuzard,想象两个线程,一个调用
increment(),另一个同时调用getValue()。getValue()调用要么返回增量之前的值,要么返回增量之后的值。 (我对吗?)。好的,现在重复实验,只是这次是synchronized int getValue()结果有什么不同?这没有有什么不同!!getValue()要么返回增量之前的值,要么返回增量之后的值。 -
@SolomonSlow 没错,这就是我的观点......因此,为什么它在当前状态下在
getValue()上已过时。直到你开始让increment()成为一个不能被“中断”的非常繁重的方法。在我对 Ravindras 答案的其他评论中有更多详细信息。 -
@Zabuzard,好的,但也许你错过了我的意思。我对你所说的做出反应,“除非你......不希望
getValue()在increment仍在执行时得到value。”听起来您认为在某些情况下,将synchronized添加到getValue()方法实际上会提供好处。
标签: java multithreading synchronized