本文摘自http://www.cnblogs.com/ziyi--caolu/p/4900650.html
在訪問數據庫或者文件的時候,我們可以使用dispatch_barrier_async避免數據競爭問題,代碼如下:
#import <Foundation/Foundation.h>
@interface ZYPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
#import "ZYPerson.h"
@interface ZYPerson ()
@end
static NSString *_name;
static dispatch_queue_t _concurrentQueue;
@implementation ZYPerson
- (instancetype)init
{
if (self = [super init]) {
_concurrentQueue = dispatch_queue_create("com.person.syncQueue", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
- (void)setName:(NSString *)name
{
dispatch_barrier_async(_concurrentQueue, ^{
_name = [name copy];
});
}
- (NSString *)name
{
__block NSString *tempName;
dispatch_sync(_concurrentQueue, ^{
tempName = _name;
});
return tempName;
}
@end
需求:多個getter方法(也就是讀取)是可以并發執行的,而getter(讀)與setter(寫)方法是不能并發執行的。
在隊列中,barrier塊必須單獨執行,不能與其他block并行。這只對并發隊列有意義,并發隊列如果發現接下來要執行的block是個barrier block,那么就一直要等到當前所有并發的block都執行完畢,才會單獨執行這個barrier block代碼塊,等到這個barrier block執行完畢,再繼續正常處理其他并發block。
因此在上面的代碼中,setter方法中使用了barrier block以后,對象的讀取操作依然是可以并發執行的,但是寫入操作就必須單獨執行了
附上一個鏈接 http://www.lxweimin.com/p/9ed95082f256 dispatch_barrier_sync和dispatch_barrier_async的對比