Java併發程式設計的藝術 十三 鎖優化

2021-08-19 21:51:18 字數 765 閱讀 5281

原理:當一條執行緒需要請求一把已經被占用的鎖時,並不會進入阻塞狀態,而是繼續持有cpu執行權等待一段時間,該過程稱為『自旋』。

優點:由於自旋等待鎖的過程執行緒並不會引起上下文切換,因此比較高效;

缺點:自旋等待過程執行緒一直占用cpu執行權但不處理任何任務,因此若該過程過長,那就會造成cpu資源的浪費。

自適應自旋:自適應自旋可以根據以往自旋等待時間的經驗,計算出乙個較為合理的本次自旋等待時間。

背景:『輕量級鎖』是相對於『重量級鎖』而言的,而重量級鎖就是傳統的鎖。

輕量級鎖與重量級鎖的比較: 

實現原理: 

前提:輕量級鎖比重量級鎖效能更高的前提是,在輕量級鎖被占用的整個同步週期內,不存在其他執行緒的競爭。若在該過程中一旦有其他執行緒競爭,那麼就會膨脹成重量級鎖,從而除了使用互斥量以外,還額外發生了cas操作,因此更慢!

與輕量級鎖的區別:輕量級鎖是在無競爭的情況下使用cas操作來代替互斥量的使用,從而實現同步;而偏向鎖是在無競爭的情況下完全取消同步。

與輕量級鎖的相同點:它們都是樂觀鎖,都認為同步期間不會有其他執行緒競爭鎖。

原理:當執行緒請求到鎖物件後,將鎖物件的狀態標誌位改為01,即偏向模式。然後使用cas操作將執行緒的id記錄在鎖物件的mark word中。以後該執行緒可以直接進入同步塊,連cas操作都不需要。但是,一旦有第二條執行緒需要競爭鎖,那麼偏向模式立即結束,進入輕量級鎖的狀態。

優點:偏向鎖可以提高有同步但沒有競爭的程式效能。但是如果鎖物件時常被多條執行緒競爭,那偏向鎖就是多餘的。

偏向鎖可以通過虛擬機器的引數來控制它是否開啟。

Java併發程式設計的藝術 筆記

併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...

java併發程式設計的藝術(六) AQS

aqs是佇列同步器 abstractqueuesynchronizer 是用來構建鎖和完成其他同步元件的基本框架,再lock裡面,很多的方法都將用到aqs以獲取同步狀態,實現鎖的語義,而不是依靠傳統的synchronized中的物件進行鎖獲取與釋放。aqs的核心思想是基於volatile int s...

Java併發程式設計的藝術 筆記2

現代作業系統排程的最小單位是執行緒,也叫輕量級程序,每個程序可建立多個程序,每個執行緒都有各自的計數器 堆疊和區域性變數等屬性,並且能夠訪問共享變數。處理器在這些執行緒上高速切換,讓使用者感覺到這些執行緒在同時執行。執行緒優先順序 決定執行緒分配處理器資源多少的屬性,設定時,針對頻繁阻塞 休眠或i ...