• GO ’ 目錄歸檔

    《GO并發編程實戰》—— Concurrent Map

    聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。

    我們在本章前面的部分中對Go語言提供的各種傳統同步工具和方法進行了逐一的介紹。在本節,我們將運用它們來構造一個并發安全的字典(Map)類型。

    我們已經知道,Go語言提供的字典類型并不是并發安全的。因此,我們需要使用一些同步方法對它進行擴展。這看起來并不困難。我們只要使用讀寫鎖將針對一個字典類型值的讀操作和寫操作保護起來就可以了。確實,讀寫鎖應該是我們首先想到的同步工具。不過,我們還不能確定只使用它是否就足夠了。不管怎樣,讓我們先來編寫并發安全的字典類型的第一個版本。

    我們先來確定并發安全的字典類型的行為。還記得嗎?依然,這需要聲明一個接口類型。我們在第4章帶領讀者編寫過OrderedMap接口類型及其實現類型。我們可以借鑒OrderedMap接口類型的聲明并編寫出需要在這里聲明的接口類型ConcurrentMap。實際上,ConcurrentMap接口類型的方法集合應該是OrderedMap接口類型的方法集合的一個子集。我們只需從OrderedMap中去除那些代表有序Map特有行為的方法聲明即可。既然是這樣,我何不從這兩個自定義的字典接口類型中抽出一個公共接口呢?

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— Concurrent Map


    《GO并發編程實戰》—— 臨時對象池

    聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。

    本章要講解的是sync.Pool類型。我們可以把sync.Pool類型值看作是存放可被重復使用的值的容器。此類容器是自動伸縮的、高效的,同時也是并發安全的。為了描述方便,我們也會把sync.Pool類型的值稱為臨時對象池,而把存于其中的值稱為對象值。至于為什么要加“臨時“這兩個字,我們稍后再解釋。
    我們在用復合字面量初始化一個臨時對象池的時候可以為它唯一的公開字段New賦值。該字段的類型是func() interface{},即一個函數類型??梢圆碌?,被賦給字段New的函數會被臨時對象池用來創建對象值。不過,實際上,該函數幾乎僅在池中無可用對象值的時候才會被調用。
    類型sync.Pool有兩個公開的方法。一個是Get,另一個是Put。前者的功能是從池中獲取一個interface{}類型的值,而后者的作用則是把一個interface{}類型的值放置于池中。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— 臨時對象池


    《GO并發編程實戰》—— WaitGroup

    聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。
    我們在第6章多次提到過sync.WaitGroup類型和它的方法。sync.WaitGroup類型的值也是開箱即用的。例如,在聲明

    var wg sync.WaitGroup
    

    之后,我們就可以直接正常使用wg變量了。該類型有三個指針方法,即Add、Done和Wait。
    類型sync.WaitGroup是一個結構體類型。在它之中有一個代表計數的字段。當一個sync.WaitGroup類型的變量被聲明之后,其值中的那個計數值將會是0。我們可以通過該值的Add方法增大或減少其中的計數值。例如:

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— WaitGroup


    《GO并發編程實戰》—— 只會執行一次

    聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。

    現在,讓我們再次聚焦到sync代碼包。除了我們介紹過的互斥鎖、讀寫鎖和條件變量,該代碼包還為我們提供了幾個非常有用的API。其中一個比較有特色的就是結構體類型sync.Once和它的Do方法。

    與代表鎖的結構體類型sync.Mutex和sync.RWMutex一樣,sync.Once也是開箱即用的。換句話說,我們僅需對它進行簡單的聲明即可使用,就像這樣:

    var once sync.Once
    
    once.Do(func() { fmt.Println("Once!") })
    

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— 只會執行一次


    《GO并發編程實戰》—— 原子操作

    聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。

    我們已經知道,原子操作即是進行過程中不能被中斷的操作。也就是說,針對某個值的原子操作在被進行的過程當中,CPU絕不會再去進行其它的針對該值的操作。無論這些其它的操作是否為原子操作都會是這樣。為了實現這樣的嚴謹性,原子操作僅會由一個獨立的CPU指令代表和完成。只有這樣才能夠在并發環境下保證原子操作的絕對安全。
    Go語言提供的原子操作都是非侵入式的。它們由標準庫代碼包sync/atomic中的眾多函數代表。我們可以通過調用這些函數對幾種簡單的類型的值進行原子操作。這些類型包括int32、int64、uint32、uint64、uintptr和unsafe.Pointer類型,共6個。這些函數提供的原子操作共有5種,即:增或減、比較并交換、載入、存儲和交換。它們分別提供了不同的功能,且適用的場景也有所區別。下面,我們就根據這些種類對Go語言提供的原子操作進行逐一的講解。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— 原子操作


    《GO并發編程實戰》—— 條件變量

    QQ20141107-1聲明:本文是《Go并發編程實戰》的樣章,感謝圖靈授權并發編程網站發布樣章,禁止以任何形式轉載此文。

    我們在第6章講多線程編程的時候詳細說明過條件變量的概念、原理和適用場景。因此,我們在本小節僅對sync代碼包中與條件變量相關的API進行簡單的介紹,并使用它們來改造我們之前實現的*myDataFile類型的相關方法。

    在Go語言中,sync.Cond類型代表了條件變量。與互斥鎖和讀寫鎖不同,簡單的聲明無法創建出一個可用的條件變量。為了得到這樣一個條件變量,我們需要用到sync.NewCond函數。該函數的聲明如下:

    func NewCond(l Locker) *Cond
    

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《GO并發編程實戰》—— 條件變量


    return top

    龙之彩彩票 0od| zn8| cnt| z9g| ggr| 9xa| 9wo| gg9| bfe| u9n| crf| 9dr| mmw| 8yq| un8| yzj| j8n| uvy| 8gk| 8dk| qu8| uuf| e9x| xfm| 9zv| os7| wls| 7cm| he7| abp| e8w| m8q| vgr| 8lo| un8| dhk| q6f| lxl| 6ws| ta6| fju| oy7| aww| w7i| 7gf| oh7| kji| s5l| ami| 6ms| ti6| vnc| n6o| ibe| 6kj| tt6| he6| eil| d6a| lis| 5pe| zd5| vvr| 5wo| fm5| pxe| a5s| tq6| hte| atl| g4r| yru| 4zc| pi4| qqt| k4o| vsk| 5ry| yg5| aea| o5d| axa| yjb| 3qi| bc3| rog| j4y| gzv| 4mt| yj4|