#import
@interface LBPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
#import "LBPerson"
@interface LBPerson ()
@end
static NSString *_gender;
static dispatch_queue_t _concurrentQueue;
@implementation LBPerson
- (instancetype)init
{
if (self = [super init]) {
_concurrentQueue = dispatch_queue_create("com.person.syncQueue", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
- (void)setGender:(NSString *)gender
{
dispatch_barrier_async(_concurrentQueue, ^{
_gender = [gender copy];
});
}
- (NSString *)gender
{
__block NSString *tempGender;
dispatch_sync(_concurrentQueue, ^{
tempGender = _gender;
});
return tempGender;
}
@end
在队列中,barrier块必须单独执行,不能与其他block并行。这只对并发队列有意义,并发队列如果发现接下来要执行的block是个barrier block,那么就一直要等到当前所有并发的block都执行完毕,才会单独执行这个barrier block代码块,等到这个barrier block执行完毕,再继续正常处理其他并发block。在上面的代码中,setter方法中使用了barrier block以后,对象的读取操作依然是可以并发执行的,但是写入操作就必须单独执行了。