5

約 1 G のデータを格納するハッシュマップは、キーと値のペアの用語です。このハッシュマップは 15 日ごとに変更されます。メモリにロードされ、そこから使用されます。

新しいハッシュマップをメモリにロードする必要がある場合、メモリ内のハッシュマップにすでにアクセスしているいくつかのトランザクションが存在します。古いハッシュマップにアクセスしている現在のトランザクションに影響を与えずに、古いハッシュマップを新しいハッシュマップに置き換えるにはどうすればよいですか。メモリ内のハッシュマップをホットスワップする方法があれば?

4

3 に答える 3

3

AtomicReference<Map<Foo, Bar>>マップへの直接 (ハード) 参照を公開するのではなく、 を使用します。マップのコンシューマーは を使用#get()し、マップを交換する準備ができたら、「内部」コードは#set()またはを使用します#getAndSet()

于 2013-07-30T07:04:23.537 に答える
1
  1. マップにゲッターを提供する
  2. マップを非公開および揮発性としてマークする
  3. マップを更新するときは、新しいマップを作成してデータを入力し、準備が整ったら、それをプライベート マップ変数に割り当てます。

参照割り当ては Java ではアトミックであり、volatile によって可視性が保証されます。

警告:

  • ある段階で、メモリに 2 つのマップが存在します。
  • 一部のコードが古いマップへの参照を保持している場合、古いデータにアクセスします。それが問題になる場合は、マップを完全に非表示にしてget(K key)代わりに を提供し、ユーザーが常に最新のマップにアクセスできるようにすることができます。
于 2013-07-30T07:24:08.477 に答える