利用dispatch_barrier_async設(shè)置讀寫鎖

利用dispatch_barrier_async方法,可以對一個值設(shè)置讀寫鎖,使讀寫過程線程安全。主要是限制“寫”,保證每次“寫”的時候是線程安全的。

特點:
必須要一個自定義并行隊列,在柵欄中的任務(wù),會等待在它之前加入到隊列的任務(wù)都完成,才會執(zhí)行;在他之后加入隊列的任務(wù),也會等它完成后才執(zhí)行。

用法:
1. 柵欄必須要在自定義的并行隊列中才能生效,所以得自己先創(chuàng)建一個并行隊列。

- (dispatch_queue_t)queue{
    
    if (!_queue) {
        _queue = dispatch_queue_create("my_lock", DISPATCH_QUEUE_CONCURRENT);
    }

    return _queue;
}
  1. 在set方法里加?xùn)艡?,利用柵欄將賦值任務(wù)加入自定義隊列,這樣就保證在執(zhí)行賦值的時候線程是安全的。
- (void)setCountFlag:(NSInteger)countFlag{
    
    dispatch_barrier_async(self.queue, ^{
        _countFlag = countFlag;
        
    });
    
}

3.在get獲取值的時候,也將取值任務(wù)放入自定義并行隊列

 - (NSInteger)countFlag
{
    __block NSInteger tempCountFlag;
    dispatch_sync(self.queue, ^{
        tempCountFlag = self.countFlag;
    });
    return tempCountFlag;
}

這樣的話,所有對于countFlag讀取操作的任務(wù)都在自定義的并行隊列中,且在每次修改countFlag后,再去讀取countFlag的值一定是修改后正確的值。之所以取值時用同步操作,是因為我們明確返回一個值后才去執(zhí)行下面方法。并且self.queue隊列中,并沒有存在會阻塞線程的長時間操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容