原子性
atomic 修饰的属性,内部会自动生成 setter getter 方法,且在生成setter getter 方法时,内部使用了 os_unfair_lock 进行加锁处理,保证了读写的原子性。锁是在 propertyLock中保存,使用之前,系统已经将锁初始化完毕,使用的时候,用对象的地址加上成员变量的偏移量作为 key 去 propertyLock中取出锁,保证存取中加锁使用的锁是同一把锁,所以 atomic可以保证存取的线程安全.
不能保证绝对线程安全
上面提到,atomic只能保证存取的线程安全,前提是使用的是系统生成的setter getter方法,下面两种情况可能导致线程不安全.
- 重写
settergetter由于系统保证atomic原子性的前提是使用默认生成的settergetter,所以如果在开发中,重写了settergetter,就无法满足加锁功能,要想保证存取线程安全,就需要自己在settergetter中加锁处理。 atomic修饰的是可变的容器类对象atomic只能在settergetter时保证存取线程安全,如果是NSMutableArrayNSMutableDictionary等对象,在修改容器类对象内容的时候,无法保证线程安全,如果想实现安全,需要自己针对场景进行加锁处理, 具体可以看我的上一篇博客