序文: ほとんどの場合、揮発性フィールドを使用しても測定可能なパフォーマンス ペナルティが発生しないことはわかっていますが、この質問はより理論的であり、非常に高い相関性をサポートする設計を対象としています。
List<Something>
構築後に埋められるフィールドがあります。パフォーマンスを節約するために、リストを読み取り専用のマップに変換したいと思います。これを行うには、少なくとも volatile Map フィールドが必要になるため、すべてのスレッドで変更が表示されるようにします。
私は次のことを考えていました:
マップマップ; public void get(オブジェクトキー){ if(map==null){ Map temp = new Map(); for(オブジェクト値: super.getList()){ temp.put(値.getKey(),値); } マップ = 温度; } 戻り map.get(キー); }
これにより、シリアライズされた方法で get ブロックに入ったとしても、複数のスレッドがマップを生成する可能性があります。スレッドがマップの異なる同一インスタンスで動作する場合、これは大きな問題にはなりません。もっと気になるのは:
1 つのスレッドが新しい一時マップをマップ フィールドに割り当て、次に 2 番目のスレッドがそれを確認してmap!=null
、新しいマップ フィールドを生成せずにマップ フィールドにアクセスすることは可能ですか?まだ共有メモリ領域にプッシュされていない場所はどこですか?
コメントへの回答:
- スレッドは一時マップのみを変更し、その後は読み取り専用になります。
- List を Map に変換する必要があるのは、特別な JAXB セットアップが原因で、最初から Map を持つことが実現できないためです。