volatile属性是否是原子属性所必需的?

sam*_*m-w 4 objective-c thread-safety

我的班级有一个属性:

@property (readwrite, atomic) BOOL IsTrue;
Run Code Online (Sandbox Code Playgroud)

我对atomic限定符的理解是@synthesize该属性的d getter/setter将保证来自不同线程的访问序列化,即如果生产者线程A是set属性值,则允许在消费者线程B和C之前完成设置操作.允许get使用属性值(在这里,atomic对于单字节/ POD类型甚至是必需的?).

volatile关键字是否提供进一步的数据完整性?

@property (readwrite, atomic) volatile BOOL IsTrue;
Run Code Online (Sandbox Code Playgroud)

我特别推动的是,消费者线程是否有可能在不使用的情况下获得过时的价值volatile

Nik*_*uhe 8

消费者线程是否有可能在不使用volatile的情况下获得过时的值?

不可以.从客户的角度来看,该属性只是一个getter/setter方法对.因此任何客户端都需要调用objc_msgSend来设置或检索值.函数调用是C中的同步点,因此无法获取过时值(如直接内存访问,volatile可能会有所帮助).

@ synthesize'd访问器将负责序列化对底层值的访问.