鎖定後如果未釋放,再次請求鎖時會造成阻塞,多線程排程通常遇到阻塞會進行上下文切換,造成更多的開銷。
在挂起與恢複線程等過程中存在着很大的開銷,并且通常存在着較長時間的中斷。
鎖可能導緻優先級反轉,即使較高優先級的線程可以搶先執行,但仍然需要等待鎖被釋放,進而導緻它的優先級會降至低優先級線程的級别。
處理器填寫了一些特殊指令,例如:比較并交換、關聯加載/條件存儲。
1 比較并交換
CAS的含義是:“我認為V的值應該為A,如果是,那麼将V的值更新為B,否則不需要修改告訴V的值實際為多少”。CAS是一項樂觀鎖技術。
模拟CAS操作例子:
2 非阻塞的計數器
基于CAS實作的非阻塞計數器
CAS的主要缺點是:它将使排程者處理競争問題(通過重試、回退、放棄),而在使用鎖中能自動處理競争問題(線程在獲得鎖之前将一直阻塞)。
3 JVM對CAS的支援
1 原子變量是一種“更好的volatile”
通過CAS來維持包含多個變量的不變性條件例子:
2 性能比較:鎖與原子變量
使用ReentrantLock、AtomicInteger、ThreadLocal比較,通常情況下效率排序是ThreadLocal > AtomicInteger > ReentrantLock。
1 非阻塞的棧
2 非阻塞的連結清單
CAS基本使用模式:在更新某個值時存在不确定性,以及在更新失敗時重新嘗試。
3 原子的域更新器
原子的域更新器類表示有volatile域的一種基于反射的“視圖”,進而能夠在已有的volatile域上使用CAS
4 ABA問題
處理V的值首先由A變成B,再由B變成A的問題。