atomic 修饰属性的原子性和不能保证绝对线程安全问题解释

203 阅读1分钟
原子性

atomic 修饰的属性,内部会自动生成 setter getter 方法,且在生成setter getter 方法时,内部使用了 os_unfair_lock 进行加锁处理,保证了读写的原子性。锁是在 propertyLock中保存,使用之前,系统已经将锁初始化完毕,使用的时候,用对象的地址加上成员变量的偏移量作为 keypropertyLock中取出锁,保证存取中加锁使用的锁是同一把锁,所以 atomic可以保证存取的线程安全.

不能保证绝对线程安全

上面提到,atomic只能保证存取的线程安全,前提是使用的是系统生成的setter getter方法,下面两种情况可能导致线程不安全.

  • 重写setter getter 由于系统保证atomic原子性的前提是使用默认生成的setter getter,所以如果在开发中,重写了setter getter,就无法满足加锁功能,要想保证存取线程安全,就需要自己在setter getter中加锁处理。
  • atomic 修饰的是可变的容器类对象 atomic只能在setter getter时保证存取线程安全,如果是NSMutableArray NSMutableDictionary等对象,在修改容器类对象内容的时候,无法保证线程安全,如果想实现安全,需要自己针对场景进行加锁处理, 具体可以看我的上一篇博客