圖解 --樂觀鎖 悲觀鎖 可重入鎖 獨佔鎖 共享鎖 公平鎖 非公平鎖

1.樂觀鎖--樂觀鎖是一種思想,它只解決對共享資源更新時的一致性問題,不解決讀取共享資源過程當中,其餘線程修改了共享資源致使讀取的是舊的資源的問題node

通常範式爲:函數

private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
            if (t == null) { // Must initialize
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
    }

 

for(;;){
    更新指望共享資源;
    if(指望共享資源==現實共享資源){
    update();
    return
    }
}    

 

這種實現存在以下問題1):ABA問題----假如是鏈表結構,1線程操做期間,其餘線程修改了A.next,1線程比較後天然覺得是預期值,判斷true,繼續操做(解決辦法加入版本號標識,比較的不單單是A的值還有A的版本號)spa

          2):自旋致使cpu壓力 線程

2.悲觀鎖--老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。應用場景能夠抽象成以下圖code

可重入鎖:獲取到外函數的鎖時,內部函數的鎖也獲取到了blog

獨佔鎖--每次只有一個線程能拿到鎖(好比synchronize 和reentrantLock)如上圖隊列

 

共享鎖--多個線程拿到鎖(ReentrantReadWriteLock )以下圖,3個讀線程都獲取鎖,可是不容許讀寫線程和寫寫線程同時都持有鎖,理由很簡單。資源

公平鎖--後續等待線程是一個FIFO隊列,先排隊的先獲取鎖it

非公平鎖--線程不排隊(默認,效率高)class

相關文章
相關標籤/搜索