2009-09-04 19 views
1

Java 6または7を使用して配列自体を同期させずに、複数のスレッドからバイト配列を安全に取り込む方法はありますか(たとえば、最初のスレッドが前半を満たし、2番目のスレッドがSystem.arraycopyを使用して後半を埋めます) jsr166関連ライブラリには、int配列(AtomicIntegerArray、ParallelIntegerArray)のみが含まれています。複数のスレッドからバイト配列を安全に埋める方法は?

+0

この質問をお寄せいただきありがとうございます。私はマルチスレッドの配列を読み書きすることは考えていませんでした。これは間違いなく私のサーバー側の世界の発電機とプロセッサーに役立つでしょう!私は、クライアント上の初期ローディング時にイメージ状態の計算を分割することもできます!私はすでに速度のために多次元としてフラットアレイを使用していますが、これは^。^です。 – Underbalanced

答えて

6

はい、動作します。配列の場所に書き込んでも、近くの場所に干渉することはありません。ただし、すべてのスレッドが読み込み前に終了していることを確認する必要があります(事前に起こっている関係)。配列を使用しているという事実は違いはありません。

+0

はい、参加はFuture.get()の形式で行われます。キャッシュアライメントが心配です。例えば、4096 + 4096で書かれた[8192]配列は問題なく動作するでしょうが、4095 + 4097はそうではありませんか? – akarnokd

+0

少なくとも、データのMD5は常に同じままです。ありがとうございました。 – akarnokd

+0

これにより、Javaバイト配列は、非アトミックバイト操作を使用してバイトを書き込むのに比べて、シングルスレッドアクセスではかなり遅くなりますか?つまり、JITまたはarraycopyの実装がループ外で境界をチェックしていたと仮定します。 –

0

これは頭痛になる良い方法のようです。 :)私はスレッドごとに1つの配列に行き、後でそれらに参加すると思います。

+0

私はそのオプションを試しましたが、私は不満でした。私はマルチスレッドオプションを試してみたいです。 – akarnokd

+1

しかし、私の提案は、スレッドを維持するために、スレッドごとに1つの配列しか持たないため、競合を避けることができました。あなたの不満の原因は何でしたか?パフォーマンス? – crunchdog

関連する問題