如何写线程安全的方法

  在没有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里面赋值成功才行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值