@property (atomic, retain) NSArray *array;
私は、セッターと配列のゲッターをオーバーライドしません。 @synchronized(array){}または@synchronized(self.array){}を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいのでしょうか?@synchronizedを使用する適切な方法はどれですか?
@property (atomic, retain) NSArray *array;
私は、セッターと配列のゲッターをオーバーライドしません。 @synchronized(array){}または@synchronized(self.array){}を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいのでしょうか?@synchronizedを使用する適切な方法はどれですか?
質問を述べたように、両方のステートメントは、並行性の安全戦略の問題として同等です。
あなたのプロジェクトでの作業の規模と距離によっては、スレッドセーフティのための別の戦略を検討することをお勧めします。
最近、Appleは従来のブロックではなく直列化によるスレッドセーフなセキュリティを推奨する点を強調しました。要するに、競合が増えるにつれ、シリアライズされたアクセスは@synchronizeでブロックするよりはるかに効率的です。
同期化するのではなく、GCDシリアルキューを設定し、スレッド間で共有されるリソースへのアクセスをキューに入れることを検討してください。
@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;
}
真剣にマルチスレッドプログラミングをしていない限り、アトミックプロパティは不要で、パフォーマンスが低下します。
明らかに、 '@synchronized'を採用しているgetterとsetterの例はスレッドセーフとはまったく異なり、このパターンはほとんど適用されません。スレッド安全性を実現するために、より高いレベルで同期を実行することがよくあります。 – Rob
また、リーダライタのパターン、GCD並行キューを使用し、 'dispatch_sync'で読み込みを行い、' dispatch_barrier_async'で書き込みます。 – Rob