@property (atomic, retain) NSArray *array;
我没有覆盖数组的setter和getter。我可以使用@synchronized(array){}或@synchronized(self.array){}。据我所知,所有案例都是正确的,我是对的吗?
答案 0 :(得分:11)
使用@syncrhonized(obj)
只会形成锁定,以便obj
上的其他代码同步不会同时执行。
原子属性的工作原理是不允许在访问属性时进行更改;它们提供隐式锁定以进行访问。
array = someObject.array; //locked
[array doSomething]; //no longer locked
您不能覆盖atomic
属性的getter和setter,但在getter / setter周围使用@sycnronized
指令就足够了。
@synthesize array=_array;
...
-(void)setArray
{
@synchronized(self)
{
_array = array;
}
}
-(NSArray *)array
{
NSArray *retVal;
@synchronized(self)
{
retVal = _array;
}
return retVal;
}
老实说,除非你正在进行一些严肃的多线程编程,否则原子属性是不必要的,只会导致性能下降。
答案 1 :(得分:9)
正如你所说的那样,这两个陈述在并发安全策略方面都是等价的。
根据规模以及您完成项目工作的程度,您可能希望完全考虑线程安全的替代策略。
最近,Apple提出了一个推荐线程安全序列化而非传统阻塞的观点。简而言之,随着争用的增加,序列化访问远比使用@synchronize阻塞更有效。
考虑设置GCD串行队列并排队访问跨线程共享的资源,而不是进行同步。