0

2つの方法がある場合:

public class A {

    public void doSomething() {
        synchronized(A.class) {
            //synchronized block here
        }
    }

    public void doSomethingElse() {
        synchronized(A.class) {
           //synchronized block here
        }
    }
}

私の質問は、A.classグローバル ロックのような動作ですか? 別のスレッドが実行されている間、 1 つのスレッド実行メソッドdoSomething()がブロックされることを意味しdoSomethingElse()ますか?

ありがとうございました。

4

3 に答える 3

3

A.class はグローバル ロックのように機能しますか?

どのsynchronizedブロックも特定のオブジェクトをロックします。ロックは、実行中A.classの の「グローバル」ロックとして機能します。これは、Javaが各ローダー ClassLoaderにオブジェクトのインスタンスが 1 つだけ存在することを保証するためです。はオブジェクトであるのと同じようにオブジェクトです。A.classA.classnew A()

ロックするA.classことは、静的メソッドをロックすることと同じです。

public class A {
    public static synchronized void someStaticMethod() {
        // in here you are locked on A.class as well
    }
    public void doSomething() {
        synchronized (A.class) {
            // this block is locked on the same object as someStaticMethod()
        }
    }
}

比較のために、(静的メソッドではなく) インスタンス メソッドをロックすると、実行中のインスタンスをロックするのと同じことになりますA。言い換えればthis

public class A {
    public synchronized void someInstanceMethod() {
        // in here you are locked on the instance of A (this)
    }
    public void doSomething() {
        synchronized (this) {
            // this block is locked on the same instance of A
        }
    }
}

繰り返しますが、それは問題の特定のオブジェクトに関するものです。ロックに関する Java ドキュメントは次のとおりです。

于 2012-07-19T22:05:54.467 に答える
1

この例では、同じクラスローダーによってロードされるAクラスのすべてのインスタンスでロックを取得するすべてのメソッドからスレッドをロックアウトします。したがって、いずれかのスレッドがロックを取得すると、他のすべてのスレッドがそのオブジェクトのメソッドにアクセスするのをブロックします。またはそのクラスの他のオブジェクト。通常、このような設定は悪い考えです。ロックは不必要に粗くなり(共有がない異なるインスタンスに属するデータにのみアクセスしたい場合でもスレッドが待機する原因になります)、同時実行性が過度に制限されます。あなたが実際にこれを必要とするデザインを持っているなら、あなたはあなたのデザインに質問するべきです。

于 2012-07-20T13:42:11.657 に答える
0

オブジェクトロックを取得し、他のすべてのスレッドはまでブロックされcurrent thread releases the lockます。Java仕様に従って:

同期メソッドは、実行前にモニター (§17.1) を取得します。クラス (静的) メソッドの場合、メソッドのクラスの Class オブジェクトに関連付けられたモニターが使用されます。インスタンス メソッドの場合、これ (メソッドが呼び出されたオブジェクト) に関連付けられたモニターが使用されます。

.

于 2012-07-19T21:35:46.557 に答える