現在のスレッドがロックを保持しているとすると、同じスレッドが呼び出します
synchronize(lock)
繰り返しますが、デッドロックは発生しますか?
ロックが同じスレッドに対して再入可能であることを漠然と覚えていますが、それはどういう意味ですか?
現在のスレッドがロックを保持しているとすると、同じスレッドが呼び出します
synchronize(lock)
繰り返しますが、デッドロックは発生しますか?
ロックが同じスレッドに対して再入可能であることを漠然と覚えていますが、それはどういう意味ですか?
ドキュメントから:
スレッドは、別のスレッドが所有するロックを取得できません。ただし、スレッドはすでに所有しているロックを取得できます。スレッドが同じロックを複数回取得できるようにすると、再入可能な同期が有効になります。これは、同期されたコードが直接的または間接的に、同期されたコードも含むメソッドを呼び出し、両方のコードセットが同じロックを使用する状況を示しています。
正しく覚えていますが、再入可能とは、同じスレッドが同じロックを複数回取得できることを意味します。例:
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()
結論:ロックは、コードのメソッド/ブロックではなく、スレッドによって取得されます。また、同じスレッドですでに取得されているロックを取得することはできません。
すべてobject
がlock 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.
ただし、現在のキー保持スレッドがキーを離すまで、他のスレッドはこのオブジェクトの同期されたブロックにアクセスできません。