2013-01-24 9 views
21

可能性の重複:私は同期のarticleて読んでいた
Java Synchronized Block for .class同期(本)

。私は以下の点を混乱し、より明確にする必要があります。

1)同期ブロックの場合。

synchronize(this){ 
    // code 
    } 

が同期)

synchronize(MyClass.class){ 
    //code 
    } 

2とどのように異なるかインスタンスメソッドは、静的メソッドを同期化するスレッドが、クラス全体のロックを取得しなければならないことを意味している間のスレッドは、インスタンス上の排他ロックを取得する必要があります意味します(私が間違っていれば私を修正してください)。したがって、クラスに3つのメソッドがあり、そのうちの1つが静的に同期化されている場合、スレッドがそのメソッドのロックを取得すると、クラス全体でロックを取得することになります。つまり、他の2つもロックされ、クラス全体がロックしているので、これら2つのメソッドにアクセスしますか?

答えて

24

MyClass.classthisは異なるものですが、異なるオブジェクトへの参照が異なります。

this

- クラスのインスタンスこの特定の参照であり、そして

MyClass.classからMyClass記述オブジェクトへの参照です。

この同期ブロックは、最初は、て具体的MyClassこのインスタンスを扱うすべてのスレッドを同期する、2つ目は、このメソッドが呼び出された独立したオブジェクトの全てのスレッドを同期する点で異なります。

9

最初の例(thisのロックを取得)は、staticメソッドの2番目のメソッド(ロックをclassオブジェクトに取得)で使用するためのものです。

MyClass.classでロックを獲得したスレッドは、このブロックがあるstaticメソッドの同期ブロックに入るのを待たなければなりません。その間、すべてのスレッドは特定のインスタンスに対してロックを取得できますインスタンスメソッドを実行します。

+0

static class varsのみがsynchronized(MyClass.class)でロックされますか? – tgkprog

+0

@tgkprog変数自体を同期させないで、メソッドへのアクセスを同期させます。 'MyClass.class'は単なるオブジェクトであり、インスタンスメソッドを同期させることも可能です(実際には必要なときは想像できませんが)が、一般的にこのパラダイムは静的メソッドで使用されます。 –

+0

hmm私は同期(MyClass.class)は、クラスで宣言された静的変数のみをロックすると考えました。それを見る必要があります。だから、もしあなたが私のクラスのインスタンスを1,000個持っていたら、それぞれが100個の変数を持っていれば、それらはすべてロックされますか? – tgkprog

関連する問題