非阻塞算法: 利用底層的源自機器指令(好比CAS)代替鎖來實現數據在併發訪問中的一致性。應用於:操做系統和JVM中實現線程/進程調度機制,垃圾回收機制以及鎖和其餘併發數據結構。 算法
與基於鎖的方案相比, 非阻塞算法實現複雜,可是可伸縮性和活躍性擁有優點,多線程競爭相同數據的狀況下不用阻塞,能夠在更細的類度上進行協調, 減小調度開銷, 在非阻塞算法中不存在死鎖和活躍性問題。 數據結構
原子變量提供了與volatile相同的內存語義, 同時支持原子操做, 比基於鎖的操做更有可伸縮性。 多線程
鎖的劣勢:競爭鎖的線程會掛起和恢復線程, 這樣調度和開銷會比較大。 併發
Volatile是更輕級別的同步機制,在使用時不會發生上下文切換或者線程調度,可是volatile不能保證構建原子的複合操做,當一個變量依賴於其餘變量或者當變量的新值依賴於舊值時, 就不能使用volatile變量。因此不能用來實現計數器和互斥體(mutex). 編碼
所得缺點還有線程在等待鎖時不能作其餘的事情, 這樣多線程等待鎖時,等待線程被阻塞。若是持有鎖的線程優先級別低而請求所得線程優先級別高就會發生優先級別翻轉(Priovrity Inversion). 操作系統
JVM對CAS的支持 線程
JAVA5.0以前若是不明確編碼,是不可以調用CAS的, 在Java5.0後,引入了底層的支持, 在int, long和對象的引用等類型上都公開了CAS操做,而且便覺得底層的硬件提供的最有效的方法, 原子變量類正是利用了這種功能來實現的。 對象
原子變量類是一種泛化的volatile變量,可以支持原子的和有條件的讀-改-寫操做。原子變量類有:AtomicInteger, AtomicLong, AtomicBoolean以及AtomicReference. 進程