利用dispatch_barrier_async方法份招,可以對(duì)一個(gè)值設(shè)置讀寫鎖惶我,使讀寫過程線程安全专挪。主要是限制“寫”接箫,保證每次“寫”的時(shí)候是線程安全的攒读。
特點(diǎn):
必須要一個(gè)自定義并行隊(duì)列,在柵欄中的任務(wù)辛友,會(huì)等待在它之前加入到隊(duì)列的任務(wù)都完成薄扁,才會(huì)執(zhí)行;在他之后加入隊(duì)列的任務(wù)废累,也會(huì)等它完成后才執(zhí)行邓梅。
用法:
1. 柵欄必須要在自定義的并行隊(duì)列中才能生效,所以得自己先創(chuàng)建一個(gè)并行隊(duì)列邑滨。
- (dispatch_queue_t)queue{
if (!_queue) {
_queue = dispatch_queue_create("my_lock", DISPATCH_QUEUE_CONCURRENT);
}
return _queue;
}
- 在set方法里加?xùn)艡谌沼В脰艡趯①x值任務(wù)加入自定義隊(duì)列,這樣就保證在執(zhí)行賦值的時(shí)候線程是安全的掖看。
- (void)setCountFlag:(NSInteger)countFlag{
dispatch_barrier_async(self.queue, ^{
_countFlag = countFlag;
});
}
3.在get獲取值的時(shí)候匣距,也將取值任務(wù)放入自定義并行隊(duì)列
- (NSInteger)countFlag
{
__block NSInteger tempCountFlag;
dispatch_sync(self.queue, ^{
tempCountFlag = self.countFlag;
});
return tempCountFlag;
}
這樣的話面哥,所有對(duì)于countFlag讀取操作的任務(wù)都在自定義的并行隊(duì)列中,且在每次修改countFlag后毅待,再去讀取countFlag的值一定是修改后正確的值尚卫。之所以取值時(shí)用同步操作,是因?yàn)槲覀兠鞔_返回一個(gè)值后才去執(zhí)行下面方法恩静。并且self.queue隊(duì)列中焕毫,并沒有存在會(huì)阻塞線程的長(zhǎng)時(shí)間操作。