Java监视器 - 同步方法是否阻止任何其他线程进入该对象?

时间:2013-04-26 22:59:04

标签: java concurrency synchronization monitor

以下是否意味着只有一个线程可以在对象的任何方法中?或者多个线程可以在不同的方法中只是不一样?为什么呢?

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

3 个答案:

答案 0 :(得分:2)

  

以下是否意味着只有一个线程可以在对象的任何方法中?

是。非静态synchronized方法在this上隐式同步。它相当于:

public void increment() {
    synchronized(this) {
        c++;
    }
}

如果这是一段真正的代码(I know it's not),我建议您完全抛弃SynchronizedCounter课程并改为使用AtomicInteger

答案 1 :(得分:2)

  

以下是否意味着只有一个线程可以在对象的任何方法中?

对于您的具体示例,是的,因为所有方法都是同步的并且是非静态的。

如果您的类有任何未同步的方法,则不会阻止未同步的方法。

如果你的类使用synchronized块而不是方法并在不同的锁上同步它们,那么它可能会变得更加复杂。

答案 2 :(得分:0)

当然,它们是synchronized对象上的this。如果您为自己的不同方法编写了自己的synchronized块,其中包含不同的对象,则不会出现这种情况。