参考:https://www.jianshu.com/p/ae1cef1f3187
并发读互斥写(Concurrent read,Exclusive write)
concurrentQueue+sync read+barrier async write
- (dispatch_queue_t)syncQueue
{
static dispatch_queue_t queue = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
queue = dispatch_queue_create("com.xxx.xxx", DISPATCH_QUEUE_CONCURRENT);
});
return queue;
}
- (NSUInteger)count
{
__block NSUInteger result;
dispatch_sync(self.syncQueue, ^{
});
return result;
}
- (id)objectAtIndex:(NSUInteger)index
{
__block id result;
dispatch_sync(self.syncQueue, ^{
});
return result;
}
- (void)removeAllObjects
{
dispatch_barrier_async(self.syncQueue, ^{
});
}
- (void)addObject:(id)anObject
{
dispatch_barrier_async(self.syncQueue, ^{
});
}
补充
@synchronized (self) {
}
dispatch_sync(self.syncQueue, ^{
});
- (dispatch_queue_t)syncQueue
{
static dispatch_queue_t queue = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
queue = dispatch_queue_create("com.xxx.xxx", DISPATCH_QUEUE_SERIAL);
});
return queue;
}
@property (nonatomic, strong) NSRecursiveLock *lock;
- (NSRecursiveLock *)lock
{
static NSRecursiveLock *internalLock = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
internalLock = [[NSRecursiveLock alloc] init];
});
return _lock = internalLock;
}
[self.lock lock];
[self.lock unlock];
网友评论