2017-05-09 18 views
0
public class A 
{ 
    public synchronized void doSomething() 
    { 
     System.out.println("Class A"); 
    } 
} 

public class B extends A 
{ 
    public synchronized void doSomething() 
    { 
     System.out.println("Class B"); 
     super.doSomething(); 
    } 
} 

私はスレッドが初めてで、以下のロックのプロパティを理解する必要があります。 上記のコードではリエントラントの意義を理解できません。再入可能性が実装されていないと、上記のコードはデッドロックします。オーバーライドされたメソッドのリエントラントロック?

答えて

1

スレッドTB.doSomething()を呼び出すと、Bのインスタンスiのロックが取得されます。その後、super.doSomething()が呼び出され、入室を許可する前にiの錠を入手する必要があります。 Tは既にiのロックを取得しているので、もう一度取得しなくてもかまいません(前に取得したロックを解除するまで可能ではありません)。

この動作は、スレッドTがすでに取得しているロックを所有している場合はそのまま通過し、再入可能ロックと呼ばれます。

ReentrantLockのjavadocを読んで、その概念も説明したいと思うかもしれません。

関連する問題