对于多线程环境中的此代码,是否需要synchronized(c)?
SynchronizedCounter c = new SynchronizedCounter();
synchronized(c){
c.increment();
c.value();
}
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
答案 0 :(得分:1)
需要,如果您想确保在c.value()
c.increment();
之后拨打value + 1
时获得thread2
为了避免c.decrement()
c.increment()
和c.value()
之间的另一个thread1
来电{{1}}
答案 1 :(得分:1)
如果你想让getValue调用看到增量的结果,而不干预另一个线程的增量或减量,你需要同步(c)。
这是一个足够普遍的要求,类似的设计通常会从增量或减量调用中返回新值。例如,请参阅java.util.concurrent.atomic.AtomicInteger。它有诸如incrementAndGet()。
之类的方法顺便说一句,如果您真的使用此代码,而不是仅使用它来说明您的问题,请考虑使用AtomicInteger。