NSObject的retain方法是原子的吗?
例如,当从两个不同的线程保留同一个对象时,是否允许保留计数增加两次,或者保留计数是否可以只增加一次?
Thanks.
NSObject
以及对象分配和保留计数函数都是线程安全的 - 请参阅附录 A:线程安全总结 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html in the 线程编程指南 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/.
Edit:我决定看一下 Core Foundation 的开源部分。在CFRuntime.c http://opensource.apple.com/source/CF/CF-855.14/CFRuntime.c, __CFDoExternRefOperation()
是负责更新保留计数器的函数。它测试进程是否有多个线程,如果有多个线程,它会在更新保留计数之前获取一个自旋锁,从而使该操作成为线程安全的。
有趣的是,保留计数不是对象的属性(或实例变量)struct
(阶级)意识。运行时保留带有保留计数器的单独结构。事实上,如果我理解正确的话,这个结构是一个哈希表数组,每个哈希表都有一个自旋锁。这意味着锁引用已放置在同一哈希表中的多个对象,即锁既不是全局的(对于所有实例)也不是每个实例的锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)