Java基礎回顧:各種鎖
阿新 • • 發佈:2021-10-13
參考:
https://tech.meituan.com/2018/11/15/java-lock.html型別
1. 樂觀鎖 & 悲觀鎖 樂觀鎖與悲觀鎖是一種廣義上的概念。- 悲觀鎖:對於同一個資料,悲觀鎖認為執行緒在使用資料時,總有其他執行緒來修改資料,因此在獲取資料的時候回先加鎖,確保資料不會被其他執行緒修改。java中Synchronized關鍵字和Lock介面實現類都是悲觀鎖。如下:
- 樂觀鎖:樂觀鎖認為自己在使用資料時不會有其他執行緒來修改資料,所以不會新增鎖。指示在更新資料的時候去判斷資料是否有被其他執行緒更新。如果這個資料沒被更新,則當前執行緒獲取資料並更新,如果資料已經被其他執行緒修改,則根據不同的實現方式執行不同的操作(例如報錯或自動重試)。樂觀鎖在Java中是通過無鎖程式設計來實現,最常採用的CAS演算法,Java原子類中的遞增操作就通過CAS自旋實現的。
- CAS:一種無鎖演算法,Compare And Swap(比較交換)。
- 需要讀寫的記憶體位置V
- 需要進行比較的預期值A
- 需要寫入的新值U