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