鎖的初認識

悲觀鎖
樂觀鎖
公平鎖
非公平鎖
獨佔鎖
共享鎖
可重入鎖
自旋鎖

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. 自旋鎖

自旋鎖是線程獲取鎖的時候,如果鎖被其他線程持有,則當前線程將循環等待,直到獲取到鎖。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章