0

对于多线程环境中的这段代码,是否需要同步(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;
    }
}
4

2 回答 2

1

如果您希望 getValue 调用查看增量的结果,而无需干预来自另一个线程的增量或减量,则确实需要 synchronized(c)。

这是一个非常普遍的要求,类似的设计经常从增量或减量调用返回新值。例如,参见java.util.concurrent.atomic.AtomicInteger。它具有诸如 incrementAndGet() 之类的方法。

顺便说一句,如果您真的在使用此代码,而不仅仅是用它来说明您的问题,请考虑使用 AtomicInteger。

于 2013-02-17T00:20:01.843 回答
1

如果您确保c.value()c.increment();您收到value + 1

避免在调用和调用之间出现另一个thread2调用的情况c.decrement()c.increment()c.value()thread1

于 2013-02-16T23:48:03.997 回答