1

簡単なシナリオは、LongAdders の配列があり、複数のスレッドがこの配列にアクセスして、特定のインデックスで変数をインクリメントすることです。

追加のロック機構なしで arraycopy を実行しても安全ですか?

私がこの問題を調査した限り、LongAdder のすべての重要なフィールドは揮発性であり、説明により、increment() はアトミックである必要があるため、問題ありません (つまり、部分的な状態を保持しないことを願っています)。今後の運用に問題あり)。

誰でもこれを確認できますか?

PS 最新のスナップショット (コピー中の増分) を取得できない可能性があることは承知していますが、問題ありません。

4

1 に答える 1

2

とにかく配列には参照LongAdderのみが含まれるため、それがコピーされます。その中のフィールドはそれとは無関係です。LongAdder

使用するのが「安全」かどうかは、それを使用arraycopyして何をしているかによって異なります-それを使用してある配列を別の配列にコピーする場合、それは問題ありません(それ自体;配列がどのように可視化されるかを心配する必要があります)ただし、スレッドに)。これを使用して配列の一部を同じ配列の別の部分にコピーする場合は、複数のスレッドが同じインデックスから読み取り、異なる参照を取得する可能性を考慮する必要があります。

于 2014-10-06T09:15:40.537 に答える