併發程式設計 日記

2021-10-19 13:55:08 字數 2130 閱讀 2622

鎖的分類:    

自旋鎖: 當訪問共享資源的時間比較短,如 ++,等簡單操作. 頻繁切換上下文消耗系統資源是不值得的.

jvm的實現是,當執行緒沒有獲得鎖的時候,執行緒不被掛起,而是執行少量的空迴圈.

迴圈幾次後,還沒有獲得鎖,則被掛起.            

阻塞鎖: 

重入鎖: synchronized 也屬於可重入鎖.

讀寫鎖: 

互斥鎖:     

悲觀鎖:     

樂觀鎖:     

公平鎖:    

非公平鎖:    

偏向鎖: 等到競爭出現才釋放鎖. 不然一直持有.    

獨佔鎖: 

共享鎖: 讀鎖就屬於共享鎖.

鎖降級: 寫執行緒獲取寫入鎖後可以獲取讀取鎖,然後釋放寫入鎖,這樣就從寫入鎖變成了讀取鎖,從而實現鎖降級的特性.    

reentrantlock: 通過是否持有鎖的標識  和  可重入次數, 來判定是否持有鎖和是否可重入.

原始碼探秘之aqs 如何用單一 int 值標識讀寫兩種狀態:

原文注釋:

abstract static class sync extends abstractqueuedsynchronizer

獲取讀鎖: 無狀態右移 16 位,

這樣操作的都是 高16位.

/** returns the number of exclusive holds represented in count */

static int exclusivecount(int c)

獲取寫鎖: 先左移16位 減1(即65535,低八位全是1,高八位用0補全),這樣做&運算,

這樣不會改變讀鎖,也能獲取寫鎖.

jdk 8 stampedlock 原理及使用.

產生的原因: 一般應用都是讀多寫少, reentrantreadwritelock 因為讀寫互斥,

故讀時阻礙寫鎖,因而效能上不去.可能會造成寫執行緒飢餓.

特點:所有獲取鎖的方法,都返回乙個郵戳(stamp),stamp為0,表示獲取失敗,其餘都表示成功.

所有釋放鎖的方法,都需要乙個郵戳(stamp),這個stamp必須是和成功獲取鎖時得到的stamp一致.

stampedlock是不可重入的;(如果乙個執行緒已經持有了寫鎖,再去獲取寫鎖的話,就會造成死鎖.)

支援鎖公升級和鎖降級.

可以樂觀讀和悲觀讀. 樂觀讀不阻礙寫操作,悲觀讀阻礙寫操作.    

使用有限次自旋,增加鎖獲得的機率,避免上下文切換帶來的開銷.

優點:相比reentrantreadwritelock,吞吐量大幅提公升.

原理:每次獲取鎖的時候都會返回乙個郵戳. 相當於資料庫樂觀鎖的version.

釋放鎖的時候,再根據之前獲得的郵戳,去進行鎖釋放.

執行緒間的通訊:

wait notify notifyall    

wait會釋放持有的鎖,而sleep不會,sleep只是讓執行緒在指定的時間內,不去搶占cpu資源.

原子類:

doubleaccumulator , longaccumulator  支援自定義運算.    

原子的更新屬性

原子的更新類裡的某個字段值.

atomicintegerfieldupdater  atomiclongfieldupdater  atomicreferencefieldupdater  atomicstampedreference

容器:同步容器和併發容器    

同步容器: 

兩個非常古老的同步容器: vector, hashtable  jdk 1.0

collections.synchronized***  jdk 1.2提供 ,本質是對相對應的容器進行包裝.

併發容器:

copyonwrite, concurrent, blockingqueue

concurrentblockingqueue: 隊列為空時阻塞.

concurrentlinkedqueue: 隊列為空時,返回空.

copyonwritearraylist iterator迭代時,是呼叫的內部類迭代器,不支援romve,add這些方法.

---------自己的筆記, 存檔下來,利於後期複習回顧.----------------

CSAPP讀書日記 第十二章 併發程式設計

構造併發程式的方法 構造併發程式最簡單的方法就是用程序,使用像fork exec和waitpid之類的函式。特點 父子程序之間共享檔案表,但是不共享使用者位址空間。優點 乙個程序不會覆蓋另乙個程序的虛擬記憶體。缺點 程序共享狀態資訊變得困難,必須使用顯式的ipc 程序間通訊 機制。結果就是這種設計方...

併發程式設計學習 併發程式設計的挑戰

死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...

網路程式設計 併發程式設計

01 網路程式設計 軟體開發架構 osi七層協議 乙太網協議 ip 埠 tcp udp 02 tcp的三次握手四次揮手理解及面試題 03 socket套接字使用 tcp連線通訊迴圈 tcp粘包問題 struct模組 tcp傳送檔案 04 udp協議 tcp udp基於socketserver的併發 ...