併發變成之:無鎖並行計算

1. 非阻塞的同步/無鎖

ThreadLocal:每一個線程擁有本身獨立的變量副本。java

基於比較交換(CAS)算法的無鎖並行控制。算法

CAS算法過程:它包含三個變量CAS(V,E,N),V表示要更新的變量,E表示預期值,N表示新值。僅當V值等於E值時,纔會將V的值設爲N,若是V的值和E的值不一樣,則說明已經有其餘線程作了更新,則當前線程 什麼也不作返回返回V當前的真實值。數據結構

CAS操做是抱着樂觀的態度進行的,它老是認爲本身能夠完成操做,當多個線程同時使用CAS操做修改一個變量時,只有會有一個線程操做成功,其他均會失敗,失敗的線程不會被掛起僅被告知失敗,能夠進行重試,或什麼都不作。併發

2. 原子操做

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就回誤覺得該值沒有被改變過。線程

3.併發線程組件Amino CBB (Concurrent Building Blocks) 

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(軟件事務內存模型)

相關文章
相關標籤/搜索