iOS dispatch_barrier_sync實現(xiàn)多讀單寫

無意翻了一下第三方代碼:

- (void)setDidAddObjectBlock:(AWSTMMemoryCacheObjectBlock)block
{
    __weak AWSTMMemoryCache *weakSelf = self;

    dispatch_barrier_async(_queue, ^{
        AWSTMMemoryCache *strongSelf = weakSelf;
        if (!strongSelf)
            return;

        strongSelf->_didAddObjectBlock = [block copy];
    });
}

- (AWSTMMemoryCacheObjectBlock)didRemoveObjectBlock
{
    __block AWSTMMemoryCacheObjectBlock block = nil;

    dispatch_sync(_queue, ^{
        block = self->_didRemoveObjectBlock;
    });

    return block;
}

dispatch_barrier_async ?? 陷入到我的知識盲區(qū)了辛辨,隨后深入的了解并實現(xiàn)了一下
簡單的說就是:一個dispatch barrier 允許在一個并發(fā)隊列中創(chuàng)建一個同步點。當在并發(fā)隊列中遇到一個barrier, 他會延遲執(zhí)行barrier的block,等待所有在barrier之前提交的blocks執(zhí)行結束够挂。 這時亥鸠,barrier block自己開始執(zhí)行百拓。 之后泥彤, 隊列繼續(xù)正常的執(zhí)行操作衔沼。這里指定的并發(fā)隊列應該是自己通過dispatch_queue_create函數(shù)創(chuàng)建的蝌借。如果你傳的是一個串行隊列或者全局并發(fā)隊列昔瞧,這個函數(shù)等同于dispatch_async函數(shù)。
所有在barrier block之后提交的blocks會等到barrier block結束之后才執(zhí)行
這特么簡單么菩佑?自晰??稍坯?
如果看不懂酬荞,詳情介紹和實例請轉:GCD學習總結(二)
好了不多bb

下面請看多讀單寫示例圖
多讀單寫.jpg

解釋一下圖:讀取是可以并發(fā)的,就是說多條線程去讀取數(shù)據(jù)不受限制可以并行瞧哟,而這個寫入操作就用上了dispatch_barrier_async 柵欄函數(shù)混巧,這個函數(shù)的作用就是在它之前的讀取操作執(zhí)行完才能執(zhí)行它,在它之后的讀取操作必須等待它執(zhí)行完(寫入操作執(zhí)行完)才能執(zhí)行勤揩。

下面給個實例:

    let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", attributes: .concurrent)

    func begin(){
        let key = "obj_key"
        DispatchQueue.global().async {
            let _:Any? =  self.getObject(key: key)//讀
        }
        DispatchQueue.global().async {
            let _:Any? =  self.getObject(key: key)//讀
        }
        DispatchQueue.global().async {
            let _:Any? =  self.getObject(key: key)//讀
        }
        DispatchQueue.global().async {
            self.setObject(obj: "obj", key: key)//寫
        }
        DispatchQueue.global().async {
            let _:Any? =  self.getObject(key: key)//讀
        }
        DispatchQueue.global().async {
            let _:Any? =  self.getObject(key: key)//讀
        }
    }
    
    //寫
    func setObject(obj:Any, key:String){
        concurrentQueue.async(flags: .barrier){
            print("正在寫入咧党。。")
            self.userCacheDic[key] = obj
        }
    }
    
    //讀
    func getObject(key:String) -> Any?{
        var obj:Any? = nil
        concurrentQueue.sync {
            obj = self.userCacheDic[key]
            print("obj == \(String(describing: obj)) Thread == \(Thread.current)")
        }
        return obj
    }
輸出陨亡;
obj == nil Thread == <NSThread: 0x2812c0180>{number = 5, name = (null)}
obj == nil Thread == <NSThread: 0x2812c0180>{number = 5, name = (null)}
obj == nil Thread == <NSThread: 0x2812df000>{number = 3, name = (null)}
正在寫入傍衡。。
obj == Optional("obj") Thread == <NSThread: 0x2812c0180>{number = 5, name = (null)}
obj == Optional("obj") Thread == <NSThread: 0x2812df000>{number = 3, name = (null)}

比較一下串行隊列负蠕,使用barrier無疑比它效率更高

相關簡書:
iOS GCD學習總結(一)
iOS GCD學習總結(二)
iOS 線程同步方案學習總結
信號量semaphore學習總結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蛙埂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遮糖,更是在濱河造成了極大的恐慌绣的,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欲账,死亡現(xiàn)場離奇詭異屡江,居然都是意外死亡,警方通過查閱死者的電腦和手機敬惦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門盼理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俄删,你說我怎么就攤上這事宏怔。” “怎么了畴椰?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵臊诊,是天一觀的道長。 經常有香客問我斜脂,道長抓艳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任帚戳,我火速辦了婚禮玷或,結果婚禮上儡首,老公的妹妹穿的比我還像新娘。我一直安慰自己偏友,他們只是感情好蔬胯,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著位他,像睡著了一般氛濒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅髓,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天舞竿,我揣著相機與錄音,去河邊找鬼窿冯。 笑死骗奖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的靡菇。 我是一名探鬼主播重归,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼米愿,長吁一口氣:“原來是場噩夢啊……” “哼厦凤!你這毒婦竟也來了?” 一聲冷哼從身側響起育苟,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤较鼓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后违柏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體博烂,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年漱竖,在試婚紗的時候發(fā)現(xiàn)自己被綠了禽篱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡馍惹,死狀恐怖躺率,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情万矾,我是刑警寧澤悼吱,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站良狈,受9級特大地震影響后添,放射性物質發(fā)生泄漏。R本人自食惡果不足惜薪丁,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一遇西、第九天 我趴在偏房一處隱蔽的房頂上張望馅精。 院中可真熱鬧,春花似錦粱檀、人聲如沸硫嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沦疾。三九已至,卻和暖如春第队,著一層夾襖步出監(jiān)牢的瞬間哮塞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工凳谦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忆畅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓尸执,卻偏偏與公主長得像家凯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子如失,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355