1、描述
在乙個cpu上同時執行多個執行緒時,會存在多個執行緒競爭cpu資源的問題,但是有時候一段**是不允許打斷,或是出現死鎖的狀態。
死鎖:多個執行緒出現了鎖巢狀,形成資源互相等待的狀態,使程式無法繼續執行。
2、解決或避免死鎖狀態的方法
①引入鎖物件-----synchronized(同步**塊)
在需要遵循原子性**段的地方使用
synchronized(鎖)
其中鎖物件可以是:共享資源,類的位元組碼,this
注意:this作為鎖物件時,需要使用同乙個runnable物件啟動所有的thread執行緒
②避免死鎖:減少執行緒數量,統一鎖物件,減少鎖巢狀
③等待喚醒機制:使用等待喚醒機制調節執行緒執行的順序,如下圖:a1,a2為同一型別執行緒,有資源競爭關係;c1,c2同樣。
初始狀態:
a1執行緒執行中:
a1執行緒執行時,a2執行緒也需要執行,但是因為資源不足,需要將a2執行緒設為等待:
c1執行緒執行
c2執行緒需要執行,但是資源被c1占用,於是到等待執行緒池中等待c1執行完成:
a1執行緒執行完成,喚醒在等待池中的a2:
c1執行緒執行完成,喚醒在等待池中的c2:
最終,a2執行緒和c2執行緒都執行完成,這樣乙個多執行緒的就有序進行:
3、執行緒的5/7種狀態關係圖:
4、sleep和
wait的
區別:sleep在使用的時候需要指定休眠時間,到點自然醒。釋放執行權,不釋放鎖。是乙個靜態方法,設計在了thread類
上wait在使用的時候可以指定等待時間,也可以不指定,如果不指定等待時間就需要喚醒。釋放執行權,釋放鎖。是乙個非靜態 方法,設計在了object類
上
多執行緒併發問題
執行緒安全是乙個非常燙手的山芋,因為即使合理運用了鎖,也不一定能保證執行緒安全,這是因為落後的編譯器無法滿足日益增長的併發需求,很多看似無錯的 在優化和併發面前產生了麻煩,可以看下面的 x 0 thread1 thread2 lock lock x x unlock unlock 上面的 看著是沒有...
筆記20200512 多執行緒 併發問題
案例 多個執行緒同時操作同乙個物件 買火車票的例子 多執行緒操作不安全咋處理呢?package com.chengguo.執行緒 多個執行緒同時操作同乙個物件 買火車票的例子 多執行緒操作不安全咋處理呢?public class demo 20200509002 thread implements ...
解決Lucene的多執行緒併發問題
建立indexwriter的方式 public class helloworld 2 在lucene程式中,成功以上面的方式建立indexwriter物件以後,會在索引庫中出現乙個鎖檔案,這個鎖檔案是當前這個indexwriter的鎖,如果呼叫indexwriter.close 關閉了鏈結,則將會把...