1

私はいつも次のシナリオで混乱しています

MyClass のオブジェクトは 1 つだけで、T1、T2 の 2 つのスレッドがあります。ここで、1 つのスレッド T2 が MyClass オブジェクト ロックのみを持つ同期メソッド m1() を使用できるようになり、他のスレッド T2 が m1() にアクセスしようとするとブロックされるとします。

現在の私の認識では、T2 が静的共有フィールドにアクセスして静的同期メソッド m2() にアクセスしようとすると、現在のオブジェクト ロックが T1 にあり、m2() を実行できず、Myclass の 2 つのオブジェクトがあった場合にブロックされます。その後、T2 スレッドは m1() にアクセスできます。私は正しいですか、それとも間違っていますか?

class MyClass
{

            public static int i = 5;

        public synchronized void m1()
        {
                System.out.println(i); //uses static field i of MyClass
            //T1 is executing this method
        }

            public static synchronized void m3()
            {
                //T2 will be able to call this method on same object lock while it is using
                //static field i???
                System.out.println(i);//uses static field i of MyClass
            }
}

これは非常に紛らわしいです助けてください。前もって感謝します。

4

4 に答える 4

6

正しくありません。メソッドの状態に関係なく、スレッドを呼び出そうとしてもブロックされるスレッドm2はないためです。synchronizedsynchronizedm1

オブジェクトのロックを取得しても、そのオブジェクトへのアクセスはブロックされません。別のスレッドが同じオブジェクトのロックを同時に取得する機能がブロックされるだけです。他のスレッドがロックを取得しようとしない場合、そのスレッドはブロックされません。

于 2012-11-27T13:39:18.033 に答える
6

今、私の認識では、T2 が同期されていないメソッド m2() にアクセスしようとすると、現在のオブジェクト ロックが T1 にあるため、ブロックされます。

いいえm2()、同期されていないため、ブロックするものは何もありません。これが、同期方式と非同期方式の違いです。

スレッドが同期メソッドに入ろうとすると、適切なモニター (ロック) を取得できるまでブロックされます。メソッドを終了すると、ロックが解除されます。同期されていないメソッドでは、これらの手順はどちらも発生しません。

(余談ですが、ほとんどの場合、同期メソッドをまったく使用しないことを個人的にお勧めします。代わりに、そのクラス内でのみ知られている参照で、メソッドで同期します。これにより、コードについて簡単に推論できます。クラスだけそのロックを取得できるためです。)

于 2012-11-27T13:39:25.787 に答える
2

あなたが間違っている。オブジェクトはブロックによって「ロック」されません。synchronized発生する唯一のことは、synchronizedそのオブジェクトのモニターを取得しようとする他のブロックが待機する必要があることです。

要約すると、synchronized同期されていないコードに対するブロック効果はまったくありません。

于 2012-11-27T13:40:46.053 に答える
1

スレッドは、同期メソッド /block に入るとロックを取得します。m2() は同期されていないため、スレッド 2 によって実行されます。同期されたメソッドがある場合にのみロックが発生することに注意してください。

于 2012-11-27T13:40:00.520 に答える