多執行緒基礎

2021-09-26 03:16:11 字數 3320 閱讀 5195

一.多執行緒訪問臨界資源

1.多個執行緒訪問乙個資源,乙個執行緒使用後來被搶走,臨界資源問題就產生了。

2.解決方法:使用的時候上把鎖,取錢的時候不能存,存的時候不要取錢即可。

3.鎖 :任意的物件都可以被當做鎖使用。

4.同步**塊 同步synchronized有等待        

(1)同步非靜態方法 synchronize boolean 返回值boolean

(2)同步靜態方法:在宣告屬性的時候加上static,變成非靜態,方法返回值加上static。

非同步asynchronized 沒有等待,各執行各的。

5.可重入鎖(reentrantlock)

在類中定義乙個reentrantlock,reentrantlock lock=new reentrantlock(); 上鎖跟解鎖是都必須有的,乙個出現另乙個也出現。用try catch的時候解鎖要放在fianlly中。

二.死鎖

每個人都有其他人需要的資源,又要等待對方的資源,在獲得所需要的資源之前又沒有放棄之前擁有的資源。

***死鎖的條件:1.兩個以上的執行緒 2.至少兩個鎖以上 3.同步中巢狀同步。

三.多執行緒在單例中的應用:餓漢式(無線程問題)和懶漢式(有執行緒問題)

***單例實現的步驟:1.私有化構造方法2.在類中建立物件 3.通過公開的方法返回這個物件

private singleton(){}
private static singleton instance =new singleton();
public static singleton getinstance()
懶漢式寫法需要解決執行緒問題,1.禁止反射破解2.加volatile3.加鎖解鎖

public class singleton 

}} private static volatile singleton instance; //volatile:不穩定的,易揮發的

public static singleton getinstance()

}} return singleton; }

}/**

* 執行緒類

* @author wgy

* */

public class singletonthread extends thread

}package com.qf.day20_6;

public class test

}

靜態內部類寫法

public class singleton2 

static class holder

public static singleton2 getinstance()

}

使用列舉

public enum  singleton3 

}

四.執行緒的通訊:生產者與消費者設計模式

描述的是一塊有緩衝區作為倉庫,生產者將產品放到倉庫,消費者從倉庫拿走商品。

wait()等待 緩衝區已經滿了或空的時候,生產者消費者停止自己的執行放棄鎖,讓自己處於等待狀態,讓其他執行緒執行。

notify()喚醒 :生產者或者消費者放入訊號,讓其他等待的執行緒執行,同時放棄鎖,讓自己處於等待狀態。

notifyall()全部喚醒 喚醒所有等待的物件。

使用鎖寫生產和消費麵包

public class breadcon
public  void input(bread b)  catch (exception e) 

}con = b;

system.out.println(thread.currentthread().getname() + "生產了" + b.getid() + "麵包");

flag = true;

concondition.signal();

} finally

}

public  void output()  catch (exception e) 

}bread b = con;

system.out.println(thread.currentthread().getname() + "消費了" + b.getid() + "麵包, 生產者名字:" + b.getproductname());

con = null;

flag = false;

procondition.signal();

} finally }

}

讀寫鎖: 可以實現多個執行緒同時讀取資料,寫執行緒需要互斥執行 讀寫 寫寫互斥   讀讀不需要互斥

執行緒池:維護成乙個佇列,然後讓其他的執行緒處於等待狀態的執行緒,不用每次都建立新的執行緒。

executorservice threadpool = executors.newfixedthreadpool(4);

executorservice threadpool = executors.newfixedthreadpool(4);

scheduledexecutorservice threadpool = executors.newscheduledthreadpool(5);

實現類:

1 threadpoolexecutor:executorservice的實現類,負責執行緒池的建立使用。

2 scheduledthreadpoolexecutor:繼承 threadpoolexecutor,並實現 scheduledexecutorservice介面,既有線程池的功能,又具有執行緒排程功能。

3 executors:執行緒池的工具類,負責執行緒池的建立。

newfixedthreadpool();建立固定大小的執行緒池。

newcachedthreadpool();建立快取執行緒池,執行緒池大小沒有限制。根據需求自動調整執行緒數量。

newsinglethreadexecutor();建立單個執行緒的執行緒池,只有乙個執行緒。

newscheduledthreadpool();建立固定大小的執行緒池,可以延遲或定時執行任務。

多執行緒基礎

對於多執行緒程式設計,很多人概念不清,寫 的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。所以學習多執行緒程式設計最重要的不是學習 api,而是理解什麼才是多執行緒安全的 從例子說起 include include long global1 0 volatile ...

多執行緒基礎

什麼是併發 同時執行多個程式,或者乙個程式的多段 在巨集觀上,存在併發的,但是在微觀上,其實不存在併發 時間片 在計算機中,使用時間片來實現併發的運算 在計算甲中,在最小的單位時間上 只能執行乙個運算 用來控制多個程式之間的輪轉,使得程式交替的執行 達到併發的目的 多個cpu 多個核心 才能實現真正...

多執行緒基礎

多執行緒的最底層依賴於unsafe的compareandswap cas 和locksupport的park和unpark操作。cas需要傳遞兩個引數 expect和update。先跟第乙個引數expect進行比較,如果等於第乙個引數,那麼就將該值設定為第二個引數,這是由硬體提供的原子操作,所以不會...