1

final としてマークされた 1 つの共有配列の要素にアクセスする複数のスレッドがあります (別の配列を割り当てようとはしません)。何かを同期する必要がありますか? 要素への読み取り/書き込みがアトミックであると想定できますか?

4

2 に答える 2

6

配列が long または double 型でない限り、書き込みはアトミックです。ただし、書き込みが他のスレッドから見えることが保証されないため、atomic プロパティは役に立ちません。

配列が参照型の場合、問題はさらに悪化します。なぜなら、他のスレッドがあなたのオブジェクトをばらばらに見るかもしれないからです。

要素のランダム アクセス コレクションを安全に共有するにはsynchronizedList、plain のラッパーArrayListまたはロックフリーのいずれかが必要CopyOnWriteArrayListです。

配列の固定サイズに問題がなければ (そう思われるかもしれませんが)、AtomicReferenceArrayアトミックな比較および設定操作と取得および設定操作が可能になるため、これも調べてください。ロックを必要とせずに必要です。

于 2012-11-05T20:26:28.013 に答える
0

ベクトルの要素を読み書きできる複数のスレッドがあるため、あるスレッドが読み込んだときに、別のスレッドが同じセルを書き込むことがあります。同期ブロックを配置します。擬似コードの例:

    public void get(index i){
        synchronized(..){
           //your code
        }
    }
于 2012-11-05T20:38:01.390 に答える