1. 程式人生 > >關於多執行緒相關問題總結一下

關於多執行緒相關問題總結一下

程序和執行緒、多執行緒

  • 程序是程式執行的基本單位,執行緒是程序中的基本單位;
  • 執行緒共享一塊記憶體和系統資源,執行緒之間切換開銷相對程序較小;執行緒也被稱為輕量級程序;
  • 各程序之間是獨立的,各執行緒之間則不是,程序之間屬於作業系統範疇
  • 多執行緒其實是幾乎同時執行幾個執行緒;可以將執行時間長的放在後臺處理,增加程式執行速度

多執行緒的使用

  • 繼承thread類
  • 實現runnable介面(推薦)

一個簡單的死鎖

有兩個鎖lock1,lock2;
程式碼塊a先獲得Lock1,裡面巢狀競爭lock2,;
程式碼塊b獲得lock2,裡面巢狀著競爭鎖lock1;
此時兩個鎖均被獲得, 而程式碼塊兒中,又在等待兩個鎖的釋放,此時產生死鎖。

執行緒的生命週期

這裡寫圖片描述

一些基本方法wait/notify/sleep/yield/join

https://blog.csdn.net/weixin_38719347/article/details/81219514
3.c

  • sleep是不釋放鎖的,而wait則會釋放鎖,又由於wait是一定在sychronized程式碼塊裡面,所以他的目的就是就鎖釋放後,以便等待此鎖的其他執行緒可以競爭此鎖
  • 結合上圖,鎖池其實就是在等待競爭得到鎖的一個池子。當notify之後,就會進入該池子。但是此時也不一定可以獲得鎖,因為可能sychronized程式碼塊還未執行完,鎖還未釋放。
  • 對於sleep和wait的用法,最常見的就是生產者和消費者模式
linkedlist list = new linkedlist();
produce(){
sychronized(list){
    while(){//倉庫不足的條件
        list.wait();//倉庫不足,進入等待佇列,等待消費後喚醒
    }
    for(){
        list.add();//生產商品
    }
    list.notifayall();
}
}
consume(){
sychronized(list){
    while(){//產品不夠的條件
        list
.wait();//不夠消費,進入等待,等著生產後喚醒 } for(){ list.remove(); } list.notifyall() } }
  • yield 交出cpu,回到可執行狀態,但是cpu交給誰由jvm排程決定
  • join,等待執行緒銷燬,通常用在某一執行緒需要等待另一執行緒的計算結果的情況
main(){
    for(int i=0; i<10; i++){
        if(i==5){
             thread t = new thread("");
             t.start();
             t.join();

        }
    }
}

此時,main執行緒,就需要等待t執行緒執行完銷燬之後,才繼續for 迴圈

reentrantlock

讀寫鎖