2011-09-16 6 views
5

可能性の重複:
What is the Re-entrant lock and concept in general?javaのロック再入荷は何のために使用されていますか?

私はJavaでリエントラントロックを理解しようとしていますし、私は簡単な説明を探しています。なぜロックの再入国が必要ですか?どのような問題が解決しますか?シナリオ例が役に立ちます。

+0

かなり重複していません。この質問は、より具体的であり、特定のJavaロック実装に関連しています。他の質問は非常に一般的です。 – Eddie

答えて

3

リエントラントロックは、同じスレッドが複数回取得することがあります。一般に、リエントラントロックは、ロックされているのと同じ回数ロックを解除する必要があります。リエントラントロックはしばしばコード化する方が簡単です。 AがBとBがCを呼び出しているが、このコードのクライアントがAまたはBまたはCを呼び出すことができ、これらの各メソッド内でロックしたい場合、再入可能なロックが問題。一度に1つのスレッド以外のスレッドがこのコードにアクセスすることはできませんが、複数のロック取得が可能になり、デッドロックは発生しません。他のコードがdoAまたはdoBまたはdoCのいずれかを呼び出すことができますし、それらのすべてが同じロックを使用して、いくつかの作品を中心に同期

public class SyncTest { 
    private final Lock lock = new ReentrantLock(); 
    public void doA() { 
    lock.lock(); 
    try { 
     doB(); 
     doSomethingForA(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doB() { 
    lock.lock(); 
    try { 
     doC(); 
     doSomethingForB(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doC() { 
    lock.lock(); 
    try { 
     doSomeWorkThatEveryoneDoes(); 
    } finally { 
     lock.unlock(); 
    } 
    } 
} 

は、あなたがこれを持っているとしましょう。使用されるロックは、同じスレッドが複数回取得できるという点で「再入可能」です。ロックが再入可能でない場合は、doAと入力してdoBと入力してロックを取得しようとすると、自分自身が所有しているにもかかわらず、ロックがすでに所有されているためデッドロックになります。

たとえば、1のカウントに初期化された純粋なカウント・セマフォは、非リエントラント・ロックです。同じスレッドが2回取得しようとすると、永久にある種の自己デッドロックでブロックされます。

関連する問題