一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java多線程之死鎖的出現和解決方法

Java多線程之死鎖的出現和解決方法

2021-01-23 12:29Java紅茶 Java教程

本篇文章主要介紹了Java多線程之死鎖的出現和解決方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

什么是死鎖?

死鎖是這樣一種情形:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放.由于線程被無限期地阻塞,因此程序不能正常運行.形象的說就是:一個寶藏需要兩把鑰匙來打開,同時間正好來了兩個人,他們一人一把鑰匙,但是雙方都再等著對方能交出鑰匙來打開寶藏,誰都沒釋放自己的那把鑰匙.就這樣這倆人一直僵持下去,直到開發人員發現這個局面.

導致死鎖的根源在于不適當地運用“synchronized”關鍵詞來管理線程對特定對象的訪問.“synchronized”關鍵詞的作用是,確保在某個時刻只有一個線程被允許執行特定的代碼塊,因此,被允許執行的線程首先必須擁有對變量或對象的排他性訪問權.當線程訪問對象時,線程會給對象加鎖,而這個鎖導致其它也想訪問同一對象的線程被阻塞,直至第一個線程釋放它加在對象上的鎖.

對synchronized不太了解的話請點擊這里

舉個例子

死鎖的產生大部分都是在你不知情的時候.我們通過一個例子來看下什么是死鎖.

1.synchronized嵌套.

synchronized關鍵字可以保證多線程再訪問到synchronized修飾的方法的時候保證了同步性.就是線程A訪問到這個方法的時候線程B同時也來訪問這個方法,這時線程B將進行阻塞,等待線程A執行完才可以去訪問.這里就要用到synchronized所持有的同步鎖.具體來看代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//首先我們先定義兩個final的對象鎖.可以看做是共有的資源.
 final Object lockA = new Object();
 final Object lockB = new Object();
//生產者A
 class ProductThreadA implements Runnable{
   @Override
   public void run() {
//這里一定要讓線程睡一會兒來模擬處理數據 ,要不然的話死鎖的現象不會那么的明顯.這里就是同步語句塊里面,首先獲得對象鎖lockA,然后執行一些代碼,隨后我們需要對象鎖lockB去執行另外一些代碼.
     synchronized (lockA){
     //這里一個log日志
       Log.e("CHAO","ThreadA lock lockA");
       try {
         Thread.sleep(2000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
       synchronized (lockB){
        //這里一個log日志
         Log.e("CHAO","ThreadA lock lockB");
         try {
           Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
 
       }
     }
   }
 }
 //生產者B
 class ProductThreadB implements Runnable{
 //我們生產的順序真好好生產者A相反,我們首先需要對象鎖lockB,然后需要對象鎖lockA.
   @Override
   public void run() {
     synchronized (lockB){
      //這里一個log日志
       Log.e("CHAO","ThreadB lock lockB");
       try {
         Thread.sleep(2000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
       synchronized (lockA){
        //這里一個log日志
         Log.e("CHAO","ThreadB lock lockA");
         try {
           Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
 
       }
     }
   }
 }
 //這里運行線程
ProductThreadA productThreadA = new ProductThreadA();
ProductThreadB productThreadB = new ProductThreadB();
 
   Thread threadA = new Thread(productThreadA);
   Thread threadB = new Thread(productThreadB);
   threadA.start();
   threadB.start();

分析一下,當threadA開始執行run方法的時候,它會先持有對象鎖localA,然后睡眠2秒,這時候threadB也開始執行run方法,它持有的是localB對象鎖.當threadA運行到第二個同步方法的時候,發現localB的對象鎖不能使用(threadB未釋放localB鎖),threadA就停在這里等待localB鎖.隨后threadB也執行到第二個同步方法,去訪問localA對象鎖的時候發現localA還沒有被釋放(threadA未釋放localA鎖),threadB也停在這里等待localA鎖釋放.就這樣兩個線程都沒辦法繼續執行下去,進入死鎖的狀態. 看下運行結果:

?
1
2
10-20 14:54:39.940 18162-18178/? E/CHAO: ThreadA lock lockA
10-20 14:54:39.940 18162-18179/? E/CHAO: ThreadB lock lockB

當不會死鎖的時候應該是打印四條log的,這里明顯的出現了死鎖的現象.

死鎖出現的原因

當我們了解在什么情況下會產生死鎖,以及什么是死鎖的時候,我們在寫代碼的時候應該盡量的去避免這個誤區.產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生.

  • 互斥條件:線程要求對所分配的資源進行排他性控制,即在一段時間內某 資源僅為一個進程所占有.此時若有其他進程請求該資源.則請求進程只能等待.
  • 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的線程自己來釋放(只能是主動釋放).
  • 請求和保持條件:線程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他線程占有,此時請求線程被阻塞,但對自己已獲得的資源保持不放.
  • 循環等待條件:存在一種線程資源的循環等待鏈,鏈中每一個線程已獲得的資源同時被鏈中下一個線程所請求。

死鎖的解決方法

說實話避免死鎖還得再自己寫代碼的時候注意一下.這里引用別人的解決方法,不過我對于這些解決方法不是太懂,講的太含糊沒有具體的實例.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/fc068f684372?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 3黑人巨大vs北岛玲 3d肉浦团在线观看 3d动漫免费 | 四大美女思春艳史片 | 小伙无套内射老女人 | 国产欧美一区视频在线观看 | 亚洲高清色图 | 青青草原国产一区二区 | a级免费在线观看 | 免费99精品国产自在现线 | 国产成人精品午夜免费 | 亚洲精品在线播放 | 女性全身裸露无遮挡 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 亚洲网视频 | 亚洲国产日韩欧美一区二区三区 | 好姑娘完整版在线观看中文 | 青春草视频免费观看 | gayrb漫画免费入口 | 236宅宅2021最新理论 | 香蕉久久久久久狠狠色 | 成年视频在线观看免费 | 2018久久精品热在线观看 | 母乳在线播放 | 黄漫免费观看 | 日本一区二区三区精品 | 亚洲免费视频在线观看 | 午夜久久久久久亚洲国产精品 | 免费观看视频高清在线 | 亚洲国产第一区二区香蕉日日 | 欧美成a人片免费看久久 | 天天草b | 国产目拍亚洲精品一区二区三区 | 亚洲国产成人久久午夜 | 成年人在线视频观看 | 日韩色在线观看 | 久久精品国产视频澳门 | 久久偷拍国2017 | 11 13加污女qq看他下面 | 午夜爱情动作片P | 日比免费视频 | 欧美影院一区二区三区 | 国产免费成人在线视频 |