私のアプリケーションでは、score
と一緒にuserIds
のリストを格納するインメモリHashMap
を維持する必要があります。Writerスレッドが1つしかなく、マップの構造的変更が行われていない場合、java HashMapの取得を同期させる必要がありますか?
ビジネスロジックに基づいてユーザーのスコアを更新するWriter Threadが1つあります。多くの読者スレッドは、このマップからscore
人のユーザー、つまりmap.get(userId)
を読み込みます。
userIds
のリストは静的です。つまり、新しいユーザーはマップに追加されません。
私は、任意の構造的変化(添加なし/削除)を作るわけではないのJavaDoc If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.
を1として。そのようなユースケースに対しては、ConcurrentHashMap
やその他のSynchronization
構造を使用する必要がありますか?
適切な同期がないと、「読み取り」スレッドが正しい値を読み取るという保証はありません。 – TheLostMind
はい、そうです。 – DejaVuSansMono
[競争条件](https://en.wikipedia.org/wiki/Race_condition)は引き続き発生しますが、あなたのケースではConcurrentModificationExceptionは発生しません。よい並行性の実践を調べるために、私はこのressourceを勧めます:http://jcip.net/ –