4

Java 1.6 と AtomicLongArray を使用して、元の AtomicLongArray を新しいものに「コピー」したいと思います。配列を取るコンストラクタ(AtomicLongArray(long[]))があるので、元の配列から配列を取得してコンストラクタに渡すだけでいいと思いました。

悲しいことに、AtomicLongArray の実際の long[] は非公開であり、getter がないようです。これを行う方法はありますか?つまり、ある AtomicLongArray から別の AtomicLongArray に値をコピーすることを意味しますか? sun.misc.Unsafe クラスを使用できないため、このクラスに基づいて独自のクラスを作成できません。

これが必要なのは、値を反復処理するためであり、反復中に別のスレッドによって変更されたくないからです。だから私はコピーを作成してそれを反復に使用できると思った...

ありがとう!フィリップ

4

2 に答える 2

5

独自のものを作成しlong[]て最初に入力するか、元のものを反復する必要があると思います:

AtomicLongArray copy = new AtomicLongArray(original.length());
for (int i = 0; i < copy.length(); i++)
{
    copy.set(i, original.get(i));
}

の個々の操作AtomicLongArrayはアトミックですが、一括操作はないことに注意してください。そのため、時間 T で配列全体の「スナップショット」を取得する方法はありません。そのような動作が必要な場合は、使用する必要があると思います同期。

于 2012-02-23T06:21:01.807 に答える
2

このデータ構造により、コレクション内の個々のエントリを同時に更新できます。全体的なロックがないため、反復中に別のスレッドが内容を変更するのを防ぐことはできません。

これが必要な場合は、回避策が必要です。たとえば、配列をコピーして再度ループし、変更されていないことを確認します。変更された場合は、繰り返します。または、グローバル ロックをサポートするコレクションが必要です。

long[] copy = new long[original.length()];
boolean changed = true;
// repeat until we get an unchanged copy.
while(true) {
    for (int i = 0; i < copy.length(); i++) {
        long l = original.get(i);
        changed |= copy[i] != l;
        copy[i] = l;
    }
    if (!changed) break;
    changed = false;
}

これは完全に安全というわけではありませんが、必要なものには十分かもしれません。

于 2012-02-23T08:20:06.043 に答える