是否需要同步块?

时间:2013-02-16 23:41:51

标签: java multithreading synchronized-block

对于多线程环境中的此代码,是否需要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;
    }
}

2 个答案:

答案 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。