多執行緒的一些需要注意的知識點

2021-10-02 14:54:35 字數 1352 閱讀 1815

一.鎖的劃分

從機制來說,鎖有6種。

1.自旋鎖

是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其他執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取鎖才會退出迴圈。

2.樂觀鎖

假定沒有衝突,在修改資料時候如果發現資料和之前獲取的不一樣,則讀取最新資料,修改後重試。

3.悲觀鎖

假定會發生衝突,同步所有對資料的相關操作,從讀資料就開始上鎖。

4.獨享鎖(寫)

給資源加上寫鎖,執行緒可以修改資源,其他執行緒不能再加鎖(單寫)

5.共享鎖(讀)

給資源加上讀鎖後只能讀不能改,其他執行緒也是只能加讀鎖,不能加寫鎖(多讀)

6.可重入鎖、不可重入鎖

執行緒拿到一把鎖後,是否可以自由進入同一把鎖所同步的其他**

從實現方式來說,鎖有兩大類。

一是由 jvm 實現的 synchronized,是可重入鎖,獨享鎖,悲觀鎖。

二是jdk 提供的 lock。

lock是乙個介面,實現一般是兩種。

1.1reentrantlock

在功能上可以說跟synchronized非常接近,需要配合condition來控制線程同步的流程

1.2readwritelock

在讀的時候是共享鎖,在寫的時候是獨享鎖。

有一種單獨拿出來說的就是cas,它是基於硬體實現的一種指令,無需我們手動實現,屬於樂觀鎖.

從使用場景去劃分

1.讀多寫少的場景

cas和readwritelock

2.讀寫比較均勻的場景

synchronized和reentrantlock

二.一些注意事項

執行緒suspend/resume被棄用的原因:suspend不會釋放鎖,所以很容易導致死鎖,而且suspend一定要再resume前面執行,否則也會死鎖

wait/notify:如果在notify被呼叫後,才執行wait方法,執行緒會一直在wait的狀態;wait/notify方法必須在同步塊裡面使用

park/unpark:不用看順序,他們就像標誌位一樣,unpark就好像是「」許可「」執行緒繼續執行,但這個也不釋放鎖

在迴圈中檢查等待條件,不要用if,因為有偽喚醒的問題

執行緒池:執行緒池管理器 工作執行緒 任務介面 任務佇列

執行緒池策略:1.先判斷任務是否達到核心執行緒數量 2.達到後判斷工作佇列是否滿,所以如果佇列是無限容量的,那它肯定不會建立新的執行緒 3.滿了後再判斷是否到達最大執行緒數量,這裡才會建立新的執行緒

4.到最後就會拒絕執行

確定合適的執行緒數量

1.計算型的任務:cpu數量的1-2倍

2.io型任務:如tomcat預設是200,可以在最小數量和最大數量設定自動增減

多執行緒的一些知識點

一.自定義來繼承thread執行緒類 步驟 1.自定義類繼承thread類 2.重寫裡面的run 方法 3.建立自定義類物件 4.啟動執行緒strat public class mythread extends thread public static void main string args 二...

PHP基礎時一些需要注意的點

這個函式是用來計算數值所佔記憶體空間,根據看的解釋是指在執行的一瞬間所占用的記憶體,具體如下圖 如果看的不是太懂,這裡還有解釋 當雙引號中包含變數時,變數所代表的的內容會和引號中的內容連線一起。當單引號中包含變數時,變數會被當做字串輸出,也就是原樣輸出,不輸出變數代表的內容。用法如下 首先使用定界符...

HTML CSS一些需要注意的基礎知識

border 0 邊框存在但不現實 並且佔記憶體 border none 邊框未渲染 html的書寫規範 1 標籤換行。2 標籤縮排。3 標籤要關閉。4 標籤名屬性不能為空。5 首先要!doctype宣告。6 編碼格式為utf 8。7 標籤要半形英文小寫。8 合理注釋。9 類名,id名要有語意的注釋...