0

マルチスレッド環境でのこのコードの場合、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;
    }
}
4

2 に答える 2

1

取得後に電話をかけたときに確認したい場合に必要です。c.value()c.increment();value + 1

の呼び出しとinの呼び出しの間に別のthread2呼び出しが行われる状況を回避するにはc.decrement()c.increment()c.value()thread1

于 2013-02-16T23:48:03.997 に答える
1

別のスレッドからのインクリメントまたはデクリメントを介在させずに、getValue 呼び出しでインクリメントの結果を確認する場合は、synchronized(c) が必要です。

これは、同様の設計がインクリメントまたはデクリメント呼び出しから新しい値を返すことが多いという十分に一般的な要件です。たとえば、java.util.concurrent.atomic.AtomicIntegerを参照してください。これには、incrementAndGet() などのメソッドがあります。

ちなみに、このコードを質問を説明するためだけに使用するのではなく、実際に使用している場合は、代わりに AtomicInteger を使用することを検討してください。

于 2013-02-17T00:20:01.843 に答える