執行緒和鎖,鎖公升級

2021-10-25 09:42:13 字數 1614 閱讀 7395

程式: qq.exe feiqiu.exe 這種靜靜的躺在硬碟的軟體

程序: 當程式載入到記憶體進行執行的就是程序資源分配的基本單位

執行緒: 是程式執行的基本單位

執行緒如何進行排程的? linux是執行緒排程器,(os)作業系統

執行緒切換的概念是什麼? context switch cpu儲存現場執行新執行緒,恢復現場,繼續執行原執行緒的過程

當沒有搶到鎖的時候,會出現忙等待,自旋等待,這種鎖叫輕量級鎖

還有就是進入乙個等待佇列,由作業系統老大來進行排程的,這種鎖叫重量級鎖

輕量級鎖的效率一定比重量級鎖的效率高嗎?
不是, 原因: 當執行緒數量太多,而持有鎖的執行緒執行久,其他等待的執行緒就進行無用的while迴圈盲目的消耗cpu資源

synchronized關鍵字

在jdk1.0和1.2中,直接使用的是重量級鎖

後面公升級成了自旋鎖

自旋鎖cas

實現方式: 比較並交換

問題: aba問題?
描述: 就是你拿到的值去比較發現是一樣的,但是這個值可能經歷了別的執行緒修改過,又修改回原來的值,所以並不能感覺出來.

解決方法: 加乙個版本號,每一次修改都要進行版本號變更

問題: cas修改值時,的原子性問題?

c++**底層使用了組合語言 單核下直接使用指令cmpxchg比較並交換,在多核下要使用lock指令,所有的cpu都支援這個指令

lock指令: 鎖匯流排

synchronized的實現原理

就是lock指令和comxchg指令,因為它底層使用了輕量級鎖,這是乙個公升級的過程

鎖的四種狀態

無鎖(new出來的時候)–>偏向鎖 --> 輕量級鎖(cas) -->重量級鎖

偏向鎖

沒有鎖的時候,來乙個執行緒,就貼上乙個自己的標籤,直接使用,效率的提公升就在不用進行判斷和競爭當又來了乙個執行緒或者多個執行緒,就把標籤撕下來,公升級成輕量級鎖,開始競爭

鎖公升級
乙個執行緒偏向鎖

多個執行緒輕量級鎖

當輕量級鎖競爭耗時過長,旋轉次數過多,開始進入等待佇列,公升級成重量級鎖

按塊讀取
程式區域性性原理,可以提高效率

充分發揮匯流排cpu腳針等一次性讀取更多資料的能力

快取行
快取行越大,區域性性空間效率越高,但讀取時間慢

快取行越小,區域性性空間效率越低,但讀取時間快

取乙個折中值,目前多用:64位元組

快取一致性協議

cpu為了保持互相快取行之間的資料的一致性採取的一致性協議, 互相通知和修改值的操作

根據快取行的特性程式設計技巧根據業務將資料進行分離, 讓不相關的不要在同乙個快取行,避免了cpu之間的相互達到快取一致,從而提高了效率

多執行緒鎖的公升級和無鎖 偏向鎖 輕量級鎖 重量級鎖

隨著競爭情況逐漸公升級,鎖可以公升級但不能降級。鎖一共四種狀態,低 高無鎖狀態 偏向鎖狀態 輕量級鎖狀態 重量級鎖狀態。偏向鎖 優點 加鎖和解鎖不需要額外的消耗,和執行非同步方法相逼僅存在納秒級的差距。缺點 如果執行緒間存在鎖競爭,會帶來額外的鎖撤銷的消耗 適用只有乙個執行緒訪問同步塊場景 輕量級鎖...

多執行緒鎖公升級的過程

鎖公升級的方向 無鎖 偏向鎖 輕量級鎖 重量級鎖,並且膨脹方向不可逆。為什麼會有偏向鎖?多數synchronized方法,在很多情況下,只有乙個執行緒在執行 例如 在stringbuffer中的一些syn 方法 在vector中的一些syn方法 偏向鎖是jdk6中引入的一項鎖優化,大多數情況下,鎖不...

synchronzied鎖公升級 鎖粗化 鎖消除

synchronized鎖可以分為 偏向鎖 輕量級鎖 重量級鎖。1 偏向鎖 實際情況下大部分的同步方法都是只有乙個執行緒來重複的獲取它,並不存在多執行緒來競爭鎖的使用權,為了避免直接加鎖造成的資源消耗,一開始獲取同步方法使用權的時候使用的是偏向鎖。當乙個執行緒a想要獲取同步方法使用權時,會先獲取鎖物...