デッドロックが状況です:複数のスレッドがブロックされ、そのうちの一つまたはすべてが解放されるリソースを待っています。スレッドが無期限にブロックされているので、そのプログラムが正常に終了することはできません。
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