0

この例のクラスを考えると:

class Example {
    String str = "";
    public synchronized boolean foo () { str = "foo"; }
    public boolean bar() { str = "bar"; }
    public synchronized boolean baz() { str = "baz"; }
}

この投稿から、どのスレッドでもbarメソッドを呼び出すことができることは明らかです。スレッドT1が実行中foo()とスレッドT2呼び出しの途中にあるとしますbar()。ロックを取得してもbar()再割り当てできますか? が実行中なのにによって呼び出された場合、同じ質問はどうですか?strfoobazT2T2foo

4

3 に答える 3

0

synchronized は次のことを行います: (たとえば) 5 つのスレッドがアクセスを要求している場合、4 つが保留になり、1 つが通過します。常に何かを同期する必要があります。これは、誰かが監視して、現在のスレッドが完了したら次にスレッドがいくつあるかを確認する必要があるためです。

しかし、この同期ブロックがなければ、誰もアクセスを制限していません。それは、裏口が大きく開いている一方で、クラブで最も重要な用心棒を持っているようなものです。「クラブ」には同期アクセスがありますが、最高のモニター (用心棒) でさえ、バックドアを知らなければ、人々がバックドアを使用するのを止めることはできません。

于 2013-11-13T13:27:13.580 に答える