執行緒和鎖,鎖升級

qq_42687144發表於2020-11-15

執行緒

執行緒執行的底層原理

程式是什麼? 程式是什麼? 執行緒是什麼?

  1. 程式: qq.exe Feiqiu.exe 這種靜靜的躺在硬碟的軟體
  2. 程式: 當程式載入到記憶體進行執行的就是程式資源分配的基本單位
  3. 執行緒: 是程式執行的基本單位

程式如何執行的? cpu讀指令存pc(程式計數器,儲存指令地址)裡,讀資料存Register,計算回寫,再下一條指令

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

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


鎖的概念

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

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

輕量級鎖的效率一定比重量級鎖的效率高嗎?

不是, 原因: 當執行緒數量太多,而持有鎖的執行緒執行久,其他等待的執行緒就進行無用的while迴圈盲目的消耗CPU資源


synchronized關鍵字

  1. 在jdk1.0和1.2中,直接使用的是重量級鎖
  2. 後面升級成了自旋鎖

自旋鎖CAS

實現方式: 比較並交換

問題: ABA問題?

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

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

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

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

lock指令: 鎖匯流排


Synchronized的實現原理

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

鎖的四種狀態

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

偏向鎖

沒有鎖的時候,來一個執行緒,就貼上一個自己的標籤,直接使用,效率的提升就在不用進行判斷和競爭

當又來了一個執行緒或者多個執行緒,就把標籤撕下來,升級成輕量級鎖,開始競爭

鎖升級

  1. 一個執行緒偏向鎖
  2. 多個執行緒輕量級鎖
  3. 當輕量級鎖競爭耗時過長,旋轉次數過多,開始進入等待佇列,升級成重量級鎖

按塊讀取

程式區域性性原理,可以提高效率

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

快取行

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

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

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

  1. 快取一致性協議

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

根據快取行的特性程式設計技巧

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

相關文章