利用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;
}
- 在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隊列中,并沒有存在會阻塞線程的長時間操作。