Obj-C2.0中的属性文档说原子属性在内部使用锁,但它没有记录锁的细节。有没有人知道这是一个基于属性的锁,一个独立于@synchronized(self)使用的隐式锁的每个对象的锁,或者等同于@synchronized(self)的锁?
发布于 2009-05-27 20:37:54
原子@properties使用的锁是一个实现细节--对于适当平台上的适当类型,可以在没有锁的情况下进行原子操作,如果苹果没有利用它们,我会感到惊讶。在任何情况下都不能对锁进行公共访问,因此您不能在同一锁上@synchronize。一些苹果工程师已经指出,原子属性并不能保证线程的安全性;原子属性只能保证该值的get/set是原子的。为了正确的线程安全,您必须使用更高级别的锁定或同步,并且几乎可以肯定的是,您不希望使用与synthesize getter/setter(s)可能正在使用的锁相同的锁。
发布于 2010-12-02 04:27:16
查看生成的代码(用于ARM的iOS SDK4.0/4.2),
使用objc_copyStruct().
double访问directly.
assign属性(包括struct {int32_t v;}),但在int64_t 4.0上,使用stmia/ldmia直接访问结构除外(我不确定在interrupts).Cocoa with Love: Memory and thread-safe custom property methods提供了一些关于如何在runtime version objc4-371.2中实现它们的细节;显然,确切的实现在不同的运行时可能会有所不同(例如,在某些平台上,您可以使用原子交换/CAS在ivar本身上旋转,而不是使用另一个锁)。
https://stackoverflow.com/questions/917884
复制相似问题