ThreadLocal:每一個線程擁有本身獨立的變量副本。java
基於比較交換(CAS)算法的無鎖並行控制。算法
CAS算法過程:它包含三個變量CAS(V,E,N),V表示要更新的變量,E表示預期值,N表示新值。僅當V值等於E值時,纔會將V的值設爲N,若是V的值和E的值不一樣,則說明已經有其餘線程作了更新,則當前線程 什麼也不作返回返回V當前的真實值。數據結構
CAS操做是抱着樂觀的態度進行的,它老是認爲本身能夠完成操做,當多個線程同時使用CAS操做修改一個變量時,只有會有一個線程操做成功,其他均會失敗,失敗的線程不會被掛起僅被告知失敗,能夠進行重試,或什麼都不作。併發
JDK中ide
java.util.concurrent.atomic.
包下有一組使用無鎖算法實現的原子操做類:AtomicInteger、AtomicIntegerArray、AtomicLong、AtomicLongArray、AtomicReference。ui
咱們以AtomicInteger中的AddAndSet(int newValue)方法來說解是如何實現原子操做的。this
/** * Atomically adds the given value to the current value. * * @param delta the value to add * @return the updated value */ public final int addAndGet(int delta) { return unsafe.getAndAddInt(this, valueOffset, delta) + delta; }
這裏咱們看到一個unsafe對象,這個是JVM提供的一個misc包下基礎類,它包含了不少的本地方法;咱們繼續看getAndAddInt如何實現;atom
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
這裏咱們能夠看到,這裏經過getIntVolatile方法獲取到預期中的原值,而後調用compareAndSwapInt(也就是咱們常說的CAS),這裏傳入的值分別爲:要修改的對象,偏移量,預期的原值,修改之後的值;
而CAS底層是經過懸鎖實現的,就再也不深追了;spa
CAS的缺點:CAS存在ABA的問題,意思就是當A被修改成B時,B又被修改成A,CAS就回誤覺得該值沒有被改變過。線程
1) 數據結構
該組件將提供一套免鎖的集合類。由於這些數據結構採用免鎖的運算法則來生成,因此,它們將擁有基本的免鎖組件的特性,如能夠避免不一樣類型的死鎖,不一樣類型的線程初始化順序等。
2) 並行模式
Amino將爲應用程序提供一個或幾個你們熟知的並行計算模式。採用這些並行模式可使開發者起到事半功倍的效果,這些模式包括Master-Worker、Map-reduce、Divide and conquer, Pipeline等,線程調度程序能夠與這些模式類協同工做,提供了開發效率。
3) 並行計算中的通常功能
Amino將爲應用程序提供並行計算中經常使用的方法,例如:
a. String、Sequence 和Array 的處理方面。如Sort、Search、Merge、Rank、Compare、Reverse、 Shuffle、Rotate和Median等
b. 處理樹和圖的方法:如組件鏈接,樹生成,最短路徑,圖的着色等
4)原子和STM(軟件事務內存模型)