Javaのデッドロックとソリューション

デッドロックが状況です:複数のスレッドがブロックされ、そのうちの一つまたはすべてが解放されるリソースを待っています。スレッドが無期限にブロックされているので、そのプログラムが正常に終了することはできません。
Javaのデッドロックのために必要な4つの条件:
  • リソースの使用は、スレッド(所持)である場合、他のスレッドが使用することができない、ある1>専用、
  • 2>つかむことができない、リソースの要求者は、乗員の手からリソースをつかむことを強制することはできません、リソースは、リソースのみのイニシアチブの乗員によって解除することができます。
  • 3>とリソースリクエスタが同時に元のリソース要求の追加のリソースを仲間を保持する、すなわち要求を保持します。
  • 4>待機ループ、すなわちキューがある。リソースのP1とP2の共有、リソースは、P2とP3、P1とP3リソースのシェアを占めていました。これは、待機ループを形成しています。
上記の4つの条件が満たされたとき、それはデッドロックを形成することになります。もちろん、これらの条件のいずれかの場合には破るために、デッドロックの場合には、あなたはデッドロックが消えることができます。次のJavaコードは、どのようなデッドロックをシミュレートするために使用しました。
デッドロックの問題を解決するには、次のとおりです。1が同期を使用することで、1がロック明示的なロックを実現しています。
ロックの不適切な使用は、あなたが複数のオブジェクトをロックすると同時に現れた場合は、次のように、デッドロック状態が存在します。
輸入java.util.Date; 

パブリッククラスLockTest { 
   公共の静的な文字列OBJ1 =「OBJ1」。
   公共の静的な文字列obj2の= "obj2の"; 
   パブリック静的無効メイン(文字列[] args){ 
      LOCKAラ=新しいLOCKA()。
      新しいスレッド(LA).start(); 
      LockBポンド=新しいLockB(); 
      新しいスレッド(ポンド).start(); 
   } 
} 
クラスLOCKA実装Runnableを{ 
   ます。public void実行(){ 
      試み{ 
         System.out.printlnは(新しいDate()のtoString()+ "LOCKA开始执行"); 
         (TRUE){一方
            同期(LockTest.obj1){  
               System.out.printlnは(新しいDate()のtoString()+ "LOCKA锁住OBJ1"。);
               のThread.sleep(3000); //此处等待是给B能锁住机会
               同期(LockTest.obj2){ 
                  のSystem.out.println(新しいDate()のtoString( )+ "LOCKAのロックOBJ2を。"); 
                  のThread.sleep(* 1000年60) ; //占有保持するために、テスト、
               } 
            } 
         } 
      }をキャッチ(例外E){ 
         e.printStackTrace(); 
      } 
   } 
} 
クラスLOCKB実装したRunnable { 
   公共空RUN(){ 
      試み{ 
         System.out.printlnは(新新。日付()のtoString()+ "LockBが開始"); 
         ながら、(真の){ 
            同期(LockTest.obj2){ 
               System.out.printlnは(新新DATE(。)のtoString()+ "LOCKBロックOBJ2"); 
               のThread.sleep(3000); //ここで待っがロックする機会与えることで
               、同期(LockTest.obj1を){
                  System.out.println(新しいDate()のtoString( )+ "LockBのロックOBJ1。"); 
                  のThread.sleep(* 1000年60); //テストは、占有保持する
               } 
            } 
         } 
      }キャッチ(例外E ){ 
         e.printStackTrace(); 
      } 
   } 
} 
実行結果: 火5月5日10時51分06秒CST 2015 LOCKB開始 火5月5日の10時51分06秒CST 2015 LOCKAが開始 火5月5日10時51分06秒CST 2015 obj2のLockBロック 火5月5日10時51分06秒CST 2015 LOCKAロックOBJ1

  

おすすめ

転載: www.cnblogs.com/Andrew520/p/12093320.html