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

时间:2012-05-08 16:14:22

标签: objective-c ios memory-management nsmutablearray nsarray

@property (atomic, retain) NSArray *array;

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

2 个答案:

答案 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串行队列并排队访问跨线程共享的资源,而不是进行同步。