2

以下は、オブジェクトの任意のメソッドに 1 つのスレッドしか存在できないことを意味しますか? または、複数のスレッドが同じメソッドではなく、異なるメソッドにある可能性がありますか? なんで?

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

以下は、オブジェクトの任意のメソッドに 1 つのスレッドしか存在できないことを意味しますか?

特定の例では、はい、すべてのメソッドが同期され、静的ではないためです。

クラスに非同期メソッドがある場合、非同期メソッドはブロックされません。

クラスがメソッドの代わりに同期ブロックを使用し、それらを異なるロックで同期した場合、さらに複雑になる可能性があります。

于 2013-04-26T23:09:29.387 に答える
2

以下は、オブジェクトの任意のメソッドに 1 つのスレッドしか存在できないことを意味しますか?

はい。非静的synchronizedメソッドは暗黙的に同期しthisます。それは以下と同等です:

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

これが実際のコードである場合(そうではないことはわかっています)SynchronizedCounter 、クラスを完全に破棄してAtomicInteger代わりに使用することをお勧めします。

于 2013-04-26T23:00:58.920 に答える
0

もちろん、それらはオブジェクトsynchronized上にありthisます。synchronizedさまざまなメソッドのさまざまなオブジェクトを使用して独自のブロックを作成した場合は、そうではありません。

于 2013-04-26T23:36:37.750 に答える