atomic

作者: xxttw | 来源:发表于2023-06-17 10:28 被阅读0次
    • 表示原子性的,保证属性的setter/getter方法内部进行加锁操作,setter/getter方法内部是线程安全的
      它并不能保证使用属性的过程是线程安全的
      一般iOS平台不推荐使用, 因为属性的set/get调用太频繁了, 非常消耗性能
      如果真的需要加锁保证属性的set/get安全, 只需要在外部进行加锁即可,没有必要使用atomic
    @propoty(strong, atomic) NSMutableArray *array;
    
    self.array = [NSMutableArray array];
    self.array 是get方法, 方法内部进行了加锁解锁,从而保证get方法内部是线程安全的
    - (void)setArray:(NSMutableArray *)array
    {
        // 加锁
      _array = array;
        // 解锁
    }
    - (NSMutableArray)array
    {
        // 加锁
      return _array;
        // 解锁
    }
    NSMutableArray array = self.array;
    [array addObject:@"123"];
    这一句不是调用的set/get方法, 如果是在多线程环境下, 就无法保证使用的安全
    dispatch_async(queue) (^
      只能保证self.array是线程按钮 addObect 无法保证
      [self.array addObject:@"123"];
    );
    
    • 实际iOS内部的自旋锁(OSspinLock 有优先级反转的问题)都已经被替换为os_unfair_lock 互斥锁, 只是名称没有改而已
    using spinlock_t = mutex_tt<LOCKDEBUG>;
    using mutex_t = mutex_tt<LOCKDEBUG>;
     
    class mutex_tt : nocopy_t {
    os_unfair_lock mLock; //处理了优先级的互斥锁
    void lock() {
      lockdebug_mutex_lock(this);
      os_unfair_lock_lock_with_options_inline
      (&mLock, OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION);
    }
    void unlock() {
      lockdebug_mutex_unlock(this);
      os_unfair_lock_unlock_inline(&mLock);
      }
    }
    

    相关文章

      网友评论

          本文标题:atomic

          本文链接:https://www.haomeiwen.com/subject/sbiyqdtx.html