2

現在のスレッドがロックを保持しているとすると、同じスレッドが呼び出します

synchronize(lock)

繰り返しますが、デッドロックは発生しますか?

ロックが同じスレッドに対して再入可能であることを漠然と覚えていますが、それはどういう意味ですか?

4

3 に答える 3

8

ドキュメントから:

スレッドは、別のスレッドが所有するロックを取得できませんただし、スレッドはすでに所有しているロックを取得できます。スレッドが同じロックを複数回取得できるようにすると、再入可能な同期が有効になります。これは、同期されたコードが直接的または間接的に、同期されたコードも含むメソッドを呼び出し、両方のコードセットが同じロックを使用する状況を示しています。

于 2012-06-10T10:18:54.747 に答える
7

正しく覚えていますが、再入可能とは、同じスレッドが同じロックを複数回取得できることを意味します。例:

private final Object lock = new Object();

public void foo() {
    synchronized(lock) {
        bar();
    }
}

public void bar() {
    synchronized(lock) {
        //...
    }
}

期待どおりに機能し、(ここでthisは暗黙のロックオブジェクトとして使用されます):

public synchronized void foo() {
    bar();
}

public synchronized void bar() {
    //...
}

デッドロックは発生しません。もちろん、他のスレッドは、ロックがすでに取得されているため、同時にアクセスすることfoo()も、アクセスすることもできません。bar()

結論:ロックは、コードのメソッド/ブロックではなく、スレッドによって取得されます。また、同じスレッドですでに取得されているロックを取得することはできません。

于 2012-06-10T10:16:33.180 に答える
0

すべてobjectlock and a keyそのを保護するために持っているので、そのを保護するcrucial data stateためにそうしevery Class has a lock and a keyますcrucial static data state.

synchronized keyword on the atomic statements(メソッドまたはアトマイズされたステートメントのいずれか)

オブジェクトをロックするようなものになります。スレッドがそのメソッドまたはアトミックステートメントにアクセスするときは、を取得する必要がありkey for that objectます。

Once it obtains the key, 
its free to access this synchronized method/statement
or any other synchronized method/statement of that object.
Thats what reentrant is all about.

ただし、現在のキー保持スレッドがキーを離すまで、他のスレッドはこのオブジェクトの同期されたブロックにアクセスできません。

于 2012-06-10T10:42:55.180 に答える