0

複数のスレッドで1つの配列にアクセスしているときに、読み取りのみまたは書き込みのみのいずれかで問題が発生する可能性があるのではないかと思います。

スレッドが配列に書き込む場合、どの順序で書き込むかは重要ではなく、同じエントリに書き込む場合でも、すべてのスレッドが同じ値を書き込みます。

たとえば、エラトステネスのふるいを介して素数を検索する場合:連続する数の配列を作成し、複数のスレッドを使用して素数のすべての倍数を0に設定します。

2の倍数を打ち消すスレッドと5の倍数を打ち消すスレッドが、同時に20から0のエントリを設定するか、前後に設定するかは関係ありません。

したがって、データの品質や一貫性の問題ではなく、Javaエラーに直面することなくデータを実行する技術的な可能性の問題です。

4

2 に答える 2

2

私はあなたが「同期制御なし」を意味すると仮定しています。簡単な答えはノーです。

同期は次の2つの理由で使用されます。

  • データの相互排除
  • スレッド間の通信

あなたの設定は、最初の理由があなたの場合には実際には問題ではないことを示しています。アルゴリズムはデータを効果的に分離し、複数のワーカースレッドが同じデータを使用しないようにします。

ただし、あるスレッドで行われた変更を別のスレッドに表示するには、同期を使用する必要があります。同期がない場合、JVMは書き込みの順序について保証しません。あるスレッドが行った更新は、後でいつでも別のスレッドに表示される場合があります。効果的なJavaアイテム#66を参照し、Javaの並行性の実践書を参照してください。

于 2013-02-04T22:57:52.303 に答える
0

最終的には変数を読み取る必要があるため(出力、ディスクへの保存など)、機能しないと思います。また、スレッド間の操作の正しい順序を保証するには、読み取りを同期する必要があります。同期がない場合、Javaはスレッド内操作の順序のみを保証することに注意してください。

さて、とにかくそれらをまったく読みたくないと言うことができますが、その場合、Javaはコード全体を破棄することを最適化することができます。

于 2013-02-04T22:42:35.290 に答える