Objective-Cでシングルトンクラスを設計しています。これは複数のスレッドからアクセスされます。私のクラスには3-30 NSMutableArray
があります。クラス外ではのアクセス権があります。オペレーションを読んだり追加したり削除したりできますが、もちろんこのクラスでラップされます。可変配列アクセスで@synchronizedディレクティブの普及に代わる方法
NSMutableArray
はスレッドセーフではないため、私は@synchronized()
ブロックを使いすぎても操作を安全にするために@synchronized()
を使用しています。
それぞれ3〜4個の配列のために、私は少なくとも1つの関数を追加しているので、1つは関数を削除し、5つは値を読み取る必要があります。だから、私は少なくとも1つの@synchronized()
ブロックを使用している1アレイの。 4アレイの場合、私のシングルトンクラスにブロックを追加する必要があります。
私の問題にアプローチする方法はありますか? また、これらの指示文をあまりにも多く使うと、問題が起きますか?
オブジェクトをスレッドセーフにしたいのであれば、コードが遅くなりますが、それ以外にも欠点はありますか?
1)シングルトンがスレッドセーフな場合は、おそらくデータメンバ_NSMutableArray_について心配する必要はありません。 2)あなたはデータメンバーの_atomic/nonatomic_属性を聞いて使用しているに違いありません。前者はスレッドセーフです。セキュリティを強化するために、_NSMutableArrays_をアトミックに宣言することができます。 – Adeel
もう1つの方法は、各アレイに対してシリアルディスパッチキューを作成することです。その後、配列更新メソッドの関連キューにアレイ更新を同期的にディスパッチできます。 @Adeelは、NSMutable配列プロパティをアトミックにしても基本配列のスレッドセーフではなく、単にプロパティ自体を作成します。 – Paulw11
@Adeel:mutableオブジェクト型のプロパティにatomic属性を使用すると、突然mutationsを同期させることはありません。スレッドセーフではありません。 1つのことと1つのことだけを行います。ゲッターとセッターが中断されないようにします。それ以降はオブジェクトがどうなっても制御されません。 –