使用@synchronized的正确方法是什么?

Vol*_*da2 9 memory-management objective-c nsmutablearray nsarray ios

@property (atomic, retain) NSArray *array;
Run Code Online (Sandbox Code Playgroud)

我没有覆盖数组的setter和getter.我可以使用@synchronized(array){}或@synchronized(self.array){}.据我所知,所有案例都是正确的,我是对的吗?

Ash*_*row 11

使用@syncrhonized(obj)只是形成一个锁,以便其他同步的代码obj不会同时执行.

原子属性的工作原理是不允许在访问属性时进行更改; 它们为访问提供隐式锁定.

array = someObject.array; //locked
[array doSomething];      //no longer locked
Run Code Online (Sandbox Code Playgroud)

您不能覆盖atomic属性的getter和setter ,但使用@sycnronizedgetter/setter周围的指令就足够了.

@synthesize array=_array;

...

-(void)setArray
{
    @synchronized(self) 
    {
        _array = array;
    }
}

-(NSArray *)array
{
    NSArray *retVal;

    @synchronized(self) 
    {
        retVal = _array;
    }

    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

老实说,除非你正在做一些严肃的多线程编程,否则原子属性是不必要的,只会导致性能下降.


isa*_*aac 9

正如你所说的那样,这两个陈述在并发安全策略方面都是等价的.

根据规模以及您完成项目工作的程度,您可能希望完全考虑线程安全的替代策略.

最近,Apple提出了一个推荐线程安全序列化而不是传统阻塞的观点.简而言之,随着争用的增加,序列化访问远比使用@synchronize阻塞更有效.

而不是同步,考虑设置GCD串行队列并排队访问跨线程共享的资源.