1.樂觀鎖--樂觀鎖是一種思想,它只解決對共享資源更新時的一致性問題,不解決讀取共享資源過程中,其他線程修改了共享資源導致讀取的是舊的資源的問題
一般范式為:
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的版本號)
2):自旋導致cpu壓力
2.悲觀鎖--總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。應用場景可以抽象成如下圖

可重入鎖:獲取到外函數的鎖時,內部函數的鎖也獲取到了
獨占鎖--每次只有一個線程能拿到鎖(比如synchronize 和reentrantLock)如上圖
共享鎖--多個線程拿到鎖(ReentrantReadWriteLock )如下圖,3個讀線程都獲取鎖,但是不允許讀寫線程和寫寫線程同時都持有鎖,理由很簡單。

公平鎖--后續等待線程是一個FIFO隊列,先排隊的先獲取鎖
非公平鎖--線程不排隊(默認,效率高)
