2

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

public class SynchronizedCounter {
    private int c = 0;

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

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

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

3 回答 3

2

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

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

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

如果这是一段真正的代码(我知道它不是),我建议完全抛弃你的SynchronizedCounter类并AtomicInteger改用它。

于 2013-04-26T23:00:58.920 回答
2

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

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

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

如果您的类使用同步块而不是方法并将它们同步到不同的锁上,它可能会变得更加复杂。

于 2013-04-26T23:09:29.387 回答
0

当然,他们synchronizedthis对象上。如果你用不同的对象为你拥有的不同方法编写了自己的synchronized块,那么情况就不会如此了。

于 2013-04-26T23:36:37.750 回答