返回

Atomic 底层原理

IOS

iOS Atomic 底层分析

引言

在多线程编程中,属性访问的线程安全至关重要。Atomic属性通过使用锁机制,确保了多线程环境下属性的读写操作是安全的。本文将探讨Atomic的底层原理,揭示其如何保证线程安全。

Atomic 原理

Atomic属性通过在 getter 和 setter 方法中使用自旋锁来实现线程安全。自旋锁是一种轻量级的锁机制,它通过自旋的方式不断尝试获取锁,直到成功为止。当一个线程尝试访问Atomic属性时,它会先尝试获取自旋锁。如果自旋锁已经被另一个线程持有,则当前线程将持续自旋,直到自旋锁被释放。

@property (nonatomic, atomic) int someNumber;

在上面的示例中,someNumber属性被标记为nonatomicatomic。这表示该属性不会由编译器自动生成gettersetter方法,而是由开发者手动实现。开发者需要在gettersetter方法中使用自旋锁来保证线程安全。

- (int)someNumber {
  while (!OSAtomicCompareAndSwapIntBarrier(oldNumber, newNumber, &_someNumber)) {
    oldNumber = _someNumber;
  }
  return _someNumber;
}

- (void)setSomeNumber:(int)newNumber {
  while (!OSAtomicCompareAndSwapIntBarrier(oldNumber, newNumber, &_someNumber)) {
    oldNumber = _someNumber;
  }
}

gettersetter方法中,使用了OSAtomicCompareAndSwapIntBarrier函数来实现自旋锁。该函数尝试将_someNumber变量中的旧值与oldNumber进行比较,如果相等,则将newNumber_someNumber进行交换。如果交换成功,则返回YES,否则返回NO。自旋锁通过不断尝试交换值来保证线程安全。

Atomic 与 Nonatomic

Nonatomic属性不使用自旋锁来保证线程安全。这意味着多个线程可以同时访问Nonatomic属性,从而可能导致数据竞争和数据损坏。Nonatomic属性通常用于不需要线程安全的情况,例如只读属性。

结论

Atomic属性通过使用自旋锁机制,确保了多线程环境下属性访问的线程安全。通过对源代码的分析和示例演示,我们深入了解了Atomic的底层原理,揭示了其如何保证线程安全。开发者应根据属性的访问场景,合理选择AtomicNonatomic属性,以确保多线程程序的正确性和稳定性。