本文摘自http://www.cnblogs.com/ziyi--caolu/p/4900650.html
在訪問數(shù)據(jù)庫或者文件的時(shí)候,我們可以使用dispatch_barrier_async避免數(shù)據(jù)競(jìng)爭(zhēng)問題锌历,代碼如下:
#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
需求:多個(gè)getter方法(也就是讀戎パ)是可以并發(fā)執(zhí)行的坪稽,而getter(讀)與setter(寫)方法是不能并發(fā)執(zhí)行的阿迈。
在隊(duì)列中毡代,barrier塊必須單獨(dú)執(zhí)行笤喳,不能與其他block并行。這只對(duì)并發(fā)隊(duì)列有意義酥泛,并發(fā)隊(duì)列如果發(fā)現(xiàn)接下來要執(zhí)行的block是個(gè)barrier block今豆,那么就一直要等到當(dāng)前所有并發(fā)的block都執(zhí)行完畢嫌拣,才會(huì)單獨(dú)執(zhí)行這個(gè)barrier block代碼塊柔袁,等到這個(gè)barrier block執(zhí)行完畢,再繼續(xù)正常處理其他并發(fā)block异逐。
因此在上面的代碼中捶索,setter方法中使用了barrier block以后,對(duì)象的讀取操作依然是可以并發(fā)執(zhí)行的灰瞻,但是寫入操作就必須單獨(dú)執(zhí)行了
附上一個(gè)鏈接 http://www.reibang.com/p/9ed95082f256 dispatch_barrier_sync和dispatch_barrier_async的對(duì)比