2012-05-08 7 views
9
@property (atomic, retain) NSArray *array; 

私は、セッターと配列のゲッターをオーバーライドしません。 @synchronized(array){}または@synchronized(self.array){}を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいのでしょうか?@synchronizedを使用する適切な方法はどれですか?

答えて

9

質問を述べたように、両方のステートメントは、並行性の安全戦略の問題として同等です。

あなたのプロジェクトでの作業の規模と距離によっては、スレッドセーフティのための別の戦略を検討することをお勧めします。

最近、Appleは従来のブロックではなく直列化によるスレッドセーフなセキュリティを推奨する点を強調しました。要するに、競合が増えるにつれ、シリアライズされたアクセスは@synchronizeでブロックするよりはるかに効率的です。

同期化するのではなく、GCDシリアルキューを設定し、スレッド間で共有されるリソースへのアクセスをキューに入れることを検討してください。

+0

また、リーダライタのパターン、GCD並行キューを使用し、 'dispatch_sync'で読み込みを行い、' dispatch_barrier_async'で書き込みます。 – Rob

10

@syncrhonized(obj)を使用すると、ロックを形成するだけで、objに同期する他のコードは同時に実行されません。

アトミックプロパティは、プロパティにアクセスしている間は変更を許可しないことによって機能します。それらはアクセスの暗黙のロックを提供します。

array = someObject.array; //locked 
[array doSomething];  //no longer locked 

あなたはatomicプロパティのゲッターとセッターをオーバーライドすることはできませんが、ゲッター/セッターの周り@sycnronizedディレクティブを使用すれば十分です。

@synthesize array=_array; 

... 

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

-(NSArray *)array 
{ 
    NSArray *retVal; 

    @synchronized(self) 
    { 
     retVal = _array; 
    } 

    return retVal; 
} 

真剣にマルチスレッドプログラミングをしていない限り、アトミックプロパティは不要で、パフォーマンスが低下します。

+1

明らかに、 '@synchronized'を採用しているgetterとsetterの例はスレッドセーフとはまったく異なり、このパターンはほとんど適用されません。スレッド安全性を実現するために、より高いレベルで同期を実行することがよくあります。 – Rob