iOS 多线程系列之dispatch_barrier_async 使用

对字典数组等属性的读写操作为保证线程安全问题,需要加一个锁来保证。

用@synchronized 实现锁的机制,但是如果很多地方用这个机制,会造成互相等待,效率不高。

自建一个NSLock来保证线程安全需要特别注意别死锁了。

可以用GCD 来实现保证线程安全问题。

我们需要实现下图的效果

因为读取式并发的并且同步的因为需要马上得到返回的结果 ,写必须是单独执行的。

看一段AFN的代码这个就是使用实例:

- (void)setValue:(NSString *)value

forHTTPHeaderField:(NSString *)field

{

    dispatch_barrier_async(self.requestHeaderModificationQueue, ^{

        [self.mutableHTTPRequestHeaders setValue:value forKey:field];

    });

}
- (NSString *)valueForHTTPHeaderField:(NSString *)field {

    NSString __block *value;

    dispatch_sync(self.requestHeaderModificationQueue, ^{

        value = [self.mutableHTTPRequestHeaders valueForKey:field];

    });

    return value;

}

注意:dispatch_barrier_async在自定义的并发队列里,全局和串形达不到我们要的效果。 苹果文档中指出,如果使用的是全局队列或者创建的不是并发队列,则dispatch_barrier_async实际上就相当于dispatch_async。

参考链接:

https://segmentfault.com/a/1190000002712678

https://www.jianshu.com/p/306481753216

https://github.com/AFNetworking/AFNetworking

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容