悲觀鎖
樂觀鎖
公平鎖
非公平鎖
獨佔鎖
共享鎖
可重入鎖
自旋鎖
1. 悲觀鎖
悲觀鎖指對數據被外界修改持保守態度,認爲數據很容易就會被其餘線程修改,因此在數據被處理前先對數據進行加鎖,
並在整個數據處理過程當中,使數據處於鎖定狀態。
悲觀鎖主要分爲共享鎖和排他鎖
1. 共享鎖【Shared lock】又稱爲讀鎖,簡稱S鎖。顧名思義,共享鎖就是多個事務對於同一數據能夠共享一把鎖,
都能訪問到數據,可是隻能讀不能修改。
2. 排他鎖【Exclusive lock】又稱爲寫鎖,簡稱X鎖。顧名思義,排他鎖就是不能與其餘鎖並存,
若是一個事務獲取了一個數據行的排他鎖,其餘事務就不能再獲取該行的其餘鎖,包括共享鎖和排他鎖,
可是獲取排他鎖的事務是能夠對數據行讀取和修改。
例如:java中的synchronized關鍵字、接口Lock的實現類、mysql的select...for update等
2. 樂觀鎖
樂觀鎖是相對悲觀鎖來講的,它認爲數據在通常狀況下不會形成衝突,因此在訪問記錄前不會加排它鎖,
而是在進行數據提交更新時,纔會正式對數據衝突與否進行檢測。
例如:使用數據版本(Version++)記錄機制實現、使用時間戳、java中Atomic的CAS等
3. 公平鎖
公平鎖表示線程獲取鎖的順序是按照線程請求鎖的時間遲早來決定的,也就是最先請求鎖的線程將最先獲取到鎖
例如:ReentrantLock pairLock = new ReentrantLock(true);
4. 非公平鎖
非公平鎖表示線程獲取鎖的順序不必定是先到先得。
例如:ReentrantLock unpairLock = new ReentrantLock(false)。若是構造函數不傳遞參數,則默認是非公平鎖。
5. 獨佔鎖
獨佔鎖是任什麼時候候都只有一個線程能獲得鎖。
例如:Java的ReentrantLock
6. 共享鎖
共享鎖是能夠同時由多個線程持有,它容許一個資源能夠被多線程同時進行讀操做。
例如:ReentrantReadWriteLock的讀鎖
7. 可重入鎖
可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖。原理是在鎖內部維護一個線程標示,用來標示該鎖目前被哪一個線程佔用,而後關聯一個計數器。一開始計數器值爲0,說明該鎖沒有被任何線程佔用。當一個線程獲取了該鎖時,計數器的值會變成1,這時其餘線程再來獲取該鎖時會發現鎖的全部者不是本身而被阻塞掛起。
例如:
public sychrnozied void test() {
xxxxxx;
test2();
}
public sychronized void test2() {
yyyyy;
}
8. 自旋鎖
自旋鎖是線程獲取鎖的時候,若是鎖被其餘線程持有,則當前線程將循環等待,直到獲取到鎖。