如何写线程安全的方法

  在没有GCD之前,处理同步可以用 @synchronized NSLock 这种方式来加锁。但是效率上就不尽如人意。 
如何用GCD写好用的线程安全方法? 

_queue=dispatch_queue_create("com.navy.queue", NULL);
- (NSString)someString{
    __block NSString *str;
    dispatch_sync(_queue, ^{
        str = _someString;
    });
    return str;
}

- (void)setSomeString:(NSString *)someString {
    dispatch_sync(_queue, ^{
        _someString = someString;
    });
};

这种方式使用串行队列同步方式来实现线程安全的属性访问,同一队列,设置和获取都是串行,不会有问题。 
不过可以再优化下,设置方法可以修改为异步dispatch_async,不过执行异步会copy lock,如果简单的方法测试效果上可能比同步更慢,复杂的方法的话可以修改为这种方案。

还有更快的方式,多个获取之间可以并行,但是获取和设置方法不能并行,可以使用并行队列。 

_queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- (NSString)someString{
    __block NSString *str;
    dispatch_sync(_queue, ^{
        str = _someString;
    });
    return str;
}

- (void)setSomeString:(NSString *)someString {
    dispatch_barrier_async(_queue, ^{
        _someString = someString;
    });
};

dispatch_barrier_async表示这个block必须单独执行,不能和其他block并行,只对并发队列有意义。 
设置方法必须用同步,因为返回值必须等block里面赋值成功才行。

你可能感兴趣的:(如何写线程安全的方法)