《筆記》之學習高併發
《筆記》1.學習高併發
讀者,你好!這是我的第一篇Blog,純屬記載學習https://my.oschina.net/hosee/blog/597934高併發知識時候的一些記錄和個人領悟!
高併發就是同一時刻有多個執行緒訪問了同一個資料資源;
常見而說不出口的名詞
- 同步 :你得等待上一個請求完成才能在傳送請求;
- 非同步 :你傳送請求時不需要等待上一個請求結束;
- 並行 :(並肩前行嘛?)兩條生產線上的流水,共同前行,互不影響 (單CPU是無法實現的);
- 併發 :一個生產線,一會這個任務執行一下,一會又切換另一個任務執行一會 (多工交替進行);
- 臨界區 ,見圖:(個人理解就是:資源佔用區間)
- 死鎖 所有執行緒都處於互相等待的一種靜止狀態;(資源相互競爭/執行緒間相互通訊造成的阻塞)
- 活鎖 所有執行緒都在相互交換僅有的資源(部分),造成誰也沒有機會得到所有資源造成阻塞的一種動態;
- 飢餓 是指執行緒一直得不到所需資源,而得不到執行的狀態;
- 併發級別的阻塞和非阻塞:
- 阻塞:當一個執行緒進入臨界區時,其他執行緒都必須等待;
- 非阻塞:可分為無障礙,無鎖,無等待
- 無障礙:(最慫的的非阻塞排程,不能確保有競爭是一定能完成操作)
- 自由進出臨界區
- 無競爭時,有限步完成操作,儘快釋放
- 有競爭時,(立馬放棄,回滾資料)
- 無鎖(可解決無障礙的問題,至少保障所有執行緒都能執行下去 廣泛使用)
- 無障礙的(即包含無障礙的特性)
- 保證有執行緒可以獲得資源
無鎖程式碼可以參考連結文中(大佬程式碼就不復制,尊重一下)
- 無等待(最優狀態,但難以實現)
- 無鎖的
- 要求所有執行緒都要在有限步內完成操作即無飢餓的(即使優先順序極低也是可以完成的,不會一直處於等待)
- 無障礙:(最慫的的非阻塞排程,不能確保有競爭是一定能完成操作)
程式&執行緒
- 執行緒是程式的執行單元
- 多程式一般不考慮併發,併發通常為多執行緒設計;
- Jvm將會把Java中的執行緒對映到作業系統的執行緒區;
- 執行緒啟動:Thread.start()
- 優雅的執行緒中斷示例:
public void run(){
while(true)
{
if(Thread.currentThread().isInterrupted())
{
System.out.println("Interruted!");
break;
}
Thread.yield();
}
}
使用中斷,保證了資料的一致性。
對於可取消的阻塞狀態中的執行緒, 比如等待在這些函式上的執行緒, Thread.sleep(), Object.wait(), Thread.join(), 這個執行緒收到中斷訊號後, 會丟擲InterruptedException, 同時會把中斷狀態置回為false.
對於取消阻塞狀態中的執行緒,可以這樣抒寫程式碼:
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("Interruted!");
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Interruted When Sleep");
//設定中斷狀態,丟擲異常後會清除中斷標記位
Thread.currentThread().interrupt();
}
Thread.yield();
}
}
-
執行緒關閉:太暴力不推薦(容易導致資料不同步)Thread.stop()==>直接釋放所有monitor?是我的風格
-
執行緒中斷:(並非立馬停止,只是將執行緒的.isInterrupted狀態改為true,提醒他接下來你要自己找個合適的時機準備停下來)但實際上並沒有停下來,只是改個狀態而已
public void Thread.interrupt() // 中斷執行緒
public boolean Thread.isInterrupted() // 判斷是否被中斷
public static boolean Thread.interrupted() // 判斷是否被中斷,並清除當前中斷狀態 -
yeild
-
yeild是個native靜態方法,這個方法是想把自己佔有的cpu時間釋放掉,然後和其他執行緒一起競爭(注意yeild的執行緒還是有可能爭奪到cpu,注意與sleep區別)。
-
join
-
方法的意思是等待其他執行緒結束
未完待續 >a<
謝謝觀看,如有理解錯誤的地方,煩請指出 >#<
相關文章
- JAVA 學習併發筆記(一)Java筆記
- (一)Java併發學習筆記Java筆記
- SSM框架實現高併發秒殺API學習筆記SSM框架API筆記
- 【Go學習筆記11】併發(一)Go筆記
- Go 併發concurrency 學習筆記Go筆記
- 高併發設計筆記筆記
- Redis基礎知識(學習筆記4--高併發問題)Redis筆記
- Go 筆記之併發Go筆記
- Laravel 高併發調優筆記Laravel筆記
- 高併發設計筆記(續篇)筆記
- LevelDB 學習筆記2:合併筆記
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- MySQL高階學習筆記(二)MySql筆記
- Memcached筆記——(四)應對高併發攻擊筆記
- 高併發秒殺專案隨手筆記筆記
- laravel學習筆記之開發環境搭建Laravel筆記開發環境
- Django之“學習筆記”網站開發1Django筆記網站
- Open CV 學習開發筆記之概述(一)筆記
- nacos學習筆記之服務發現中心筆記
- Kinect開發學習筆記之(二)Kinect開發學習資源整理筆記
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- node學習筆記之39筆記
- 學習筆記之測試筆記
- Swoft 學習筆記之配置筆記
- Boltdb學習筆記之〇--概述筆記
- flask學習筆記之blueprintFlask筆記
- JS學習筆記之this指向JS筆記
- Java學習筆記之staticJava筆記
- oracle之awr學習筆記Oracle筆記
- Web之http學習筆記WebHTTP筆記
- 【學習筆記】線段樹合併 & 分裂筆記
- JUC併發程式設計學習筆記(四)8鎖現象程式設計筆記
- JUC併發程式設計學習筆記(六)Callable(簡單)程式設計筆記
- 觸發器學習筆記觸發器筆記
- oracle學習筆記(十一) 高階查詢Oracle筆記
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- js高階 物件導向 學習筆記JS物件筆記
- redis學習筆記(詳細)——高階篇Redis筆記