多執行緒知識點總結

2021-08-02 05:14:14 字數 1555 閱讀 2892

多執行緒的問題主要圍繞3個問題處理:1.原子性,2.可見性,3.有序性

1.原子性,不可被其他執行緒打斷的操作。如read.write

sychronized

2.可見性:一條執行緒修改了某值,新值對其他執行緒立即可知;

普通變數是通過主記憶體完成多執行緒的共享,因此在多執行緒的情況下,很多髒資料。

volatile,sychronized,final

3.有序性:保證多執行緒的操作順序同**執行順序一致。

如1)i=0,2)j=i,3)i=20.a執行緒執行1後,才能執行2,然後c執行3,若c指令使3提前執行,則最後結果為i=10,j=10

sychornized,volatile

執行緒排程

協同排程,執行結束後,主動通知系統切換到另乙個執行緒上。

缺點:如果不告知,會形成阻塞。

搶占式排程:執行緒由系統分配時間,執行緒切換不由執行緒決定。

執行緒五個狀態:新建、執行、等待、阻塞、結束。

執行緒安全

當多個執行緒訪問乙個物件時,總能獲得正確的呼叫結果。

悲觀鎖和樂觀鎖

悲觀鎖:每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,

樂觀鎖:拿資料的時候都認為別人不會修改,所以不會上鎖。如cas

執行緒安全實現方法

1.互斥同步

為悲觀鎖,且阻塞同步。

方法有:臨界區,互斥量,訊號量。

同步手段:1.sychronized;2.reentraintlock

1.非阻塞同步

為樂觀鎖。cas實現。

鎖的四種狀態:無鎖,偏向鎖,輕量級鎖,重量級鎖。

鎖優化:

自旋鎖,鎖消除,鎖粗化,輕量級鎖,偏向鎖。

1.自旋鎖:執行緒發現沒有取得鎖時,為防止執行緒頻繁切換狀態,可以並行兩個或者兩個以上的執行緒,使後面的執行緒等待釋放鎖(需要讓其執行乙個迴圈,即自旋)

2.鎖消除:對**上要求同步,實際上被檢測到不可能存在共享資料競爭的鎖進行消除。

3.鎖粗化:原則上使同步塊作用範圍盡量小——只在共享資料的實際作用域中才進行同步。但如果沒有執行緒競爭,也頻繁進行互斥同步等操作,會導致不必要的效能消耗。此時要把加鎖同步範圍擴充套件,即粗化到整個系列外部。

4.輕量級鎖:無競爭的情況下使用cas操作消除同步使用的互斥量

場景:執行緒交替執行同步塊的情況,若同時訪問同一鎖,會膨脹為重量級鎖。 

5.偏向鎖:把整個同步消掉,進出也沒有cas。鎖會偏向於第乙個獲得它的執行緒,記錄第一次獲得鎖的執行緒id,之後該id的執行緒再次進入 這個鎖的相關同步塊時,虛擬機器不再做任何操作,如lock,unlock.當有其他執行緒嘗試獲取該鎖時,偏向模式結束。

如1)i=0,2)j=i,3)i=20.a執行緒執行1後,才能執行2,然後c執行3,若c指令使3提前執行,則最後結果為i=10,j=10

sychornized,volatile

多執行緒 知識點總結二

1.sleep 和wait 方法的區別?sleep 必須指時間 不釋放鎖。wait 可以不指定時間,也可以指定時間 釋放鎖。2.為什麼wait notify notifyall 等方法都定義在object類中?wait 等待,notify 喚醒單個執行緒,notifyall 喚醒所有的執行緒 這些方...

java併發 多執行緒知識點總結

1 web庫類 sevlet天生有多執行緒性。2 定義任務 使用runnable介面並實現run 方法。而將runnable 不返回任何值 物件程式設計工作任務的方式為 thread t new thread new task t.start 這裡start 會迅速返回,因為每個任務都由不同的執行緒...

java 多執行緒知識點總結2

4 synchronized的優化 鎖粗化與鎖消除 死鎖 公平鎖 等待時間最長的先獲取鎖 synchronized是非公平鎖,reentrantlock預設也為非公平鎖,但可以實現公平鎖 同步佇列 所有獲取鎖失敗的執行緒進入同步佇列排隊獲取鎖。等待佇列 呼叫wait 的執行緒置入等待佇列,等待not...