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