NSObject的retain方法是原子操作吗?
比如说,当在两个不同的线程中保留同一个对象时,是否可以保证该对象的引用计数会增加两次?还是可能只会增加一次?
谢谢。
NSObject
以及对象分配和保留计数函数都是线程安全的 — 请参阅附录A:线程安全摘要,位于线程编程指南中。
编辑:我决定看一下Core Foundation的开源部分。在CFRuntime.c中,__CFDoExternRefOperation()
是负责更新保留计数器的函数。它会测试进程是否有多个线程,如果有多个线程,则在更新保留计数之前获取自旋锁,从而使此操作线程安全。
有趣的是,保留计数不是struct
(类)意义上对象的属性(或实例变量)。运行时保留一个单独的带有保留计数器的结构。事实上,如果我理解正确,这个结构是哈希表数组,每个哈希表都有一个自旋锁。这意味着锁引用了被放置在同一个哈希表中的多个对象,即锁既不是全局的(适用于所有实例),也不是每个实例的。