天天看點

《Java并發程式設計實戰》第十五章 原子變量與非阻塞同步機制 讀書筆記一、鎖的劣勢二、硬體對并發的支援三、原子變量類四、非阻塞算法

鎖定後如果未釋放,再次請求鎖時會造成阻塞,多線程排程通常遇到阻塞會進行上下文切換,造成更多的開銷。

在挂起與恢複線程等過程中存在着很大的開銷,并且通常存在着較長時間的中斷。

鎖可能導緻優先級反轉,即使較高優先級的線程可以搶先執行,但仍然需要等待鎖被釋放,進而導緻它的優先級會降至低優先級線程的級别。

處理器填寫了一些特殊指令,例如:比較并交換、關聯加載/條件存儲。

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的問題。

下一篇: IPMI 備忘錄