iOS 关于线程安全的Tips

本文探讨了iOS开发中的线程安全问题,指出atomic属性仅保证set、get的原子性,但并非线程安全。同时,文章提醒开发者NSNotification在发送线程与接收线程相同,线程不安全的集合类如NSMutableArray、NSMutableDictionary应谨慎处理。Swift的Immutable并不直接等于线程安全,并举例说明。最后,文章提出实现线程安全NSMutableArray的方法以及为何nonatomic的不可变类通常不会崩溃,而可变类可能引起问题。
摘要由CSDN通过智能技术生成

atomic 不能绝对的保证线程安全

Set

这是 OC 中设置属性 与原子性有关情况所做的操作

    if (!atomic) {
        oldValue = *slot;
        *slot = newValue;
    } else {
        spinlock_t& slotlock = PropertyLocks[slot];
        slotlock.lock();
        oldValue = *slot;
        *slot = newValue;        
        slotlock.unlock();
    }

我们可以看到,如果属性的修饰符是atomic 那么OC运行时会给我们的代码上自旋锁锁,
保证set方法的原子性。

Get

这是OC Get方法根据属性的原子性所做的操作

    // Retain release world
    id *slot = (id*) ((char*)self + offset);
    if (!atomic) return *slot;

    // Atomic retain release world
    spinlock_t& slotlock = PropertyLocks[slot];
    slotlock.lock();
    id value = objc_retain(*slot);
    slotlock.unlock();

atomic通过这种方法,在运行时保证 set,get方法的原子性。
但是! 仅仅是保证了set,get方法的原子性。

随便找个例子,这种线程就是不安全的。

@property (atomic, assign)    int       intA;

//thread A
for (int i = 0; i < 10000; i ++) {
    self
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值