シンクロナイズドリエントラントロック分析

再帰的ロックとして知られているリエントラントロックは、同じスレッド手段外層、再入力スレッドの内層方法は、自動的に(ロックが同じオブジェクトまたはオブジェクトクラスでなければならないことを条件とする)ロックを取得する場合、方法のロックを取得

以前、まだ取得されていませんJitsukataとブロッキングが発生します。その同じスレッドが同じロックを保持するための複数の方法を実行することができます。

コードの一部に最初:

パブリック クラスReentrantSynchronized {
     公共 同期 無効firstIPhoneByElectric(){ 
        System.out.printlnは( "第一の部のiphone充电..." + にThread.currentThread()のgetName()); 
        secondIPhoneByElectric(); 
    } 

    公共 同期 ボイドsecondIPhoneByElectric(){ 
        System.out.printlnは( "第二部iPhone充电..." + にThread.currentThread()のgetName()。)。
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        ReentrantSynchronized reentrantSynchronized = 新しい ReentrantSynchronized()。
        reentrantSynchronized.firstIPhoneByElectric()。
    } 

}

同時に複数のiPhoneの充電にすることができる多用途充電ケーブルと同時に、任意の競合および妨害されず、それが最初のiPhoneである(ロック)充電ケーブル得ることができ、また第二部は、ケーブルのiPhoneを充電得ることができる充電することができます(ロック)が充電されています。

次のように実行結果は以下のとおりです。

 

 

 上記のコードでは、クラス内の2つの方法は、(secondIPhoneByElectricメソッドを呼び出す)は、第2の携帯電話を充電するために第1の部分(firstIPhoneByElectric処理)充電中の携帯電話に同期変形ロック構築されます。

secondIPhoneByElectric多用途充電行(同期がリエントラントである)を呼び出すときに、第2の携帯電話が充電時に同一人物が再充電可能なラインを使用して直接充電することができるように(同じスレッドは、直接得ることができるため

現在のロック・オブジェクト、プロセス)secondIPhoneByElectric動作を移行します。

アイデア:充電ケーブルは、最初の電話が完全に充電されるまでsecondIPhoneByElectricは、充電ケーブルを後にリリース呼び出し、現在のスレッドで(単独で使用することが可能な第2の携帯電話に充電するとき、あなたは待たなければなりません(同期していない場合はリエントラント)であります

)firstIPhoneByElectricロック獲得の前に解放されなければならない、実際には、充電ラインは、それが死んで表示され、(オブジェクトロックが現在のスレッドによって保持され、かつ解放することができない)、初の携帯電話によって占有されており、解放することはできませんロック。

その原理は何ですか?

スレッドがロックを取得しようとすると、ロックリエントラント最初の試みを取得するために、ステータス== 0は、他のスレッドの同期コードの実行は、状態が1に設定されて入れていないことを示す場合、状態値を更新し、現在のスレッドが実行を開始します。状態の場合!= 0、

現在のスレッドは、スレッドがロックを獲得し、そしてもしそうであれば実行状態+ 1、及び現在のスレッドが再びロックを取得できているかどうか判断されます。ステータス場合とないリエントラントロックは、現在の値の状態を取得し、更新するための直接的な試みです!= 0

これは、ロックを獲得するために、その故障につながる、現在のスレッドがブロックされました。

ロックが解除された場合、現在のスレッドの状態の現在の値を取得するために同じリエントラントロックは、ロックを保持しているスレッドの前提です。状態-1 == 0は、その後、現在のスレッドは、すべての操作が終了したロックリピートを取得した場合、

その後、スレッドは、実際にロックを解除します。そしてないリエントラントロックは、ロックを保持しているスレッドの後に現在のスレッドを決定している状態が0に設定されている直接で、ロックが解除されます。

 

おすすめ

転載: www.cnblogs.com/java-spring/p/11532109.html