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 ++) {

本文探讨了iOS开发中的线程安全问题,指出atomic属性仅保证set、get的原子性,但并非线程安全。同时,文章提醒开发者NSNotification在发送线程与接收线程相同,线程不安全的集合类如NSMutableArray、NSMutableDictionary应谨慎处理。Swift的Immutable并不直接等于线程安全,并举例说明。最后,文章提出实现线程安全NSMutableArray的方法以及为何nonatomic的不可变类通常不会崩溃,而可变类可能引起问题。
2605

被折叠的 条评论
为什么被折叠?



