2
Class A {
    private Map<Oject,Object> map;
    public void clear() {
        map.clear();
    }

    public void work() {
        synchronized (map) {
            map.put(new Object, new Object();
        }
    }
}

スレッド A がメソッドの途中にあるwork()場合、メソッドを実行してもスレッド B はブロックされないというclear()ことですか?

上記のコードとこれを持つことの違いは何ですか?

    public void clear() {
        synchronized (map) {
            map.clear();
        }
    }
4

3 に答える 3

5

あなたの疑いは正しいです。このコードにはバグがあります。

ロックする必要clear()もあります。それ以外は; 同時に実行することもできますput()clear()

ただし、実際にはConcurrentHashMap()代わりに a を使用する必要があります。

于 2013-01-10T21:29:21.490 に答える
1

Correct. Why would it? That's the point of the synchronized block - and thread B hasn't executed a synchronized block. In this case, it's exactly like there was no synchronisation at all.

于 2013-01-10T21:29:17.357 に答える
0

特定のリソースへのアクセスを制御する必要がある場所ごとに、同期する必要があります。最初の例は、同期されたブロックにヒットした場合にのみ同期された方法で実行されます (これは にありませんclear())。それ以外の場合は、通常どおり続行します。2 番目の例でロックclear()すると、スレッド B がチェックします。

于 2013-01-10T21:30:00.567 に答える