Java併發編程CAS

JDK 5 的併發包中提供了不少類,這些類提供了比原有的併發機制更好的性能和伸縮性。要想理解這些類的工做機理,那就不得不提到 CAS。CAS 全稱是 Compare and Swap,是指現代主流 CPU 都支持的一種指令,這個指令能爲多線程編程帶來更好的性能(稍後會詳細介紹)。另一個可能會被當作 CAS 的是 Compare and Set,是指 JDK 5 併發包中普遍使用的一種基於 Compare and Swap 的併發算法。嚴格說 CAS 僅指代前者。算法

Compare and Swap

在這裏,CAS 指的是現代 CPU 普遍支持的一種對內存中的共享數據進行操做的一種特殊指令。這個指令會對內存中的共享數據作原子的讀寫操做。簡單介紹一下這個指令的操做過程:首先,CPU 會將內存中將要被更改的數據與指望的值作比較。而後,當這兩個值相等時,CPU 纔會將內存中的數值替換爲新的值。不然便不作操做。最後,CPU 會將舊的數值返回。這一系列的操做是原子的。它們雖然看似複雜,但倒是 Java 5 併發機制優於原有鎖機制的根本。簡單來講,CAS 的含義是「我認爲原有的值應該是什麼,若是是,則將原有的值更新爲新值,不然不作修改,並告訴我原來的值是多少」(這段描述引自《Java Concurrency in Practice》)編程

Compare and Set

在理解了什麼是 Compare and Swap 以後,理解 Compare and Set 便很容易了。Compare and Set 就是利用 Compare and Swap 實現的非阻塞的線程安全的寫操做算法。它的實現過程以下:首先讀取你要更改的數據的原值,而後將其和你要更新成的值做爲 Compare and Swap 操做的兩個參數,若是 Compare and Swap 的返回值和原值不一樣,便重複這一過程,直至成功。寫成僞代碼以下安全

int old;
int new;
do {
    old = value.get();
    new = doSomeCalcBasedOn(old)
while (value.compareAndSwap(old, new));

Compare and Set 是一個非阻塞的算法,這是它的優點。可是有一個問題就是存在這樣的可能,在每次讀操做以後,寫操做以前,都有另一個線程更改了原先的值,這樣 Compare and Set 操做就會不停地重試。但這樣的可能只存在於理論,在實際中不多發生。多線程

Compare and Set 普遍使用在 Java 5 中的 Atomic 類中,其它的諸如 ReetrantLock、Semaphore 等的類也經過 AbstractQueuedSynchronizer 類間接地使用了 Compare and Set。併發

相關文章
相關標籤/搜索