sho*_*sti 6 iphone cocoa multithreading properties objective-c
Objective-C属性默认为atomic
,它确保访问器是原子的,但不能确保整体线程安全性(根据这个问题).我的问题是,在大多数并发场景中,原子属性是不是多余的?例如:
场景1:可变属性
@interface ScaryMutableObject : NSObject {}
@property (atomic, readwrite) NSMutableArray *stuff;
@end
void doStuffWith(ScaryMutableObject *obj) {
[_someLock lock];
[obj.stuff addObject:something]; //the atomic getter is completely redundant and could hurt performance
[_someLock unlock];
}
//or, alternatively
void doStuffWith(ScaryMutableObject *obj) {
NSMutableArray *cachedStuff = obj.stuff; //the atomic getter isn't redundant
[_someLock lock];
[cachedStuff addObject:something]; //but is this any more performant than using a nonatomic accessor within the lock?
[_someLock unlock];
}
Run Code Online (Sandbox Code Playgroud)
场景2:不可变属性
我在想,在处理不可变对象时,原子属性可能对避免锁有用,但由于不可变对象可以指向Objective-C中的可变对象,所以这并没有多大帮助:
@interface SlightlySaferObject : NSObject {}
@property (atomic, readwrite) NSArray *stuff;
@end
void doStuffWith(SlightlySaferObject *obj) {
[[obj.stuff objectAtIndex:0] mutateLikeCrazy];//not at all thread-safe without a lock
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一场景是在没有锁的情况下使用原子访问器是安全的(因此值得使用原子属性):
NSString
或一个NSArray
不可变对象).我错过了什么吗?有没有其他充分理由使用原子属性?
归档时间: |
|
查看次数: |
2052 次 |
最近记录: |