利用dispatch_barrier_async方法,可以对一个值设置读写锁,使读写过程线程安全。主要是限制“写”,保证每次“写”的时候是线程安全的。
特点:
必须要一个自定义并行队列,在栅栏中的任务,会等待在它之前加入到队列的任务都完成,才会执行;在他之后加入队列的任务,也会等它完成后才执行。
用法:
1. 栅栏必须要在自定义的并行队列中才能生效,所以得自己先创建一个并行队列。
- (dispatch_queue_t)queue{
if (!_queue) {
_queue = dispatch_queue_create("my_lock", DISPATCH_QUEUE_CONCURRENT);
}
return _queue;
}
- 在set方法里加栅栏,利用栅栏将赋值任务加入自定义队列,这样就保证在执行赋值的时候线程是安全的。
- (void)setCountFlag:(NSInteger)countFlag{
dispatch_barrier_async(self.queue, ^{
_countFlag = countFlag;
});
}
3.在get获取值的时候,也将取值任务放入自定义并行队列
- (NSInteger)countFlag
{
__block NSInteger tempCountFlag;
dispatch_sync(self.queue, ^{
tempCountFlag = self.countFlag;
});
return tempCountFlag;
}
这样的话,所有对于countFlag读取操作的任务都在自定义的并行队列中,且在每次修改countFlag后,再去读取countFlag的值一定是修改后正确的值。之所以取值时用同步操作,是因为我们明确返回一个值后才去执行下面方法。并且self.queue队列中,并没有存在会阻塞线程的长时间操作。
网友评论