私は以前、値 (equals) ベースの等価性を持つ SoftReference が必要な場合、これからインターナーを除いて、設計が悪いという結論に達しました。これは、そのようなクラスを含まない Google Collections および Guava に従っています。しかし、そのようなオブジェクトを使用できると思われる問題に遭遇しました。
ビジュアル エフェクト レンダー ファームにアセット管理システムがあり、レンダリングするフレーム数だけが異なる同じジョブを実行する数百のプロセスがあります。使用されたすべての資産を記録する必要がある Oracle データベースがあります。すべてのジョブから 1 つだけが成功する同一の挿入で Oracle をドキドキする代わりに、中間層の資産管理システムでは、HashSet を使用して、オブジェクトが Oracle に挿入されるかどうかを記録できます。
有効期限付きの Google MapMaker を使用することもできますが、有効期限を正しく設定することについて心配する必要はありません。レンダリングは数時間で実行され、場合によっては数日で実行されます。等値で SoftReference を使用すると、JVM がガベージ コレクションを自動的に管理するため、はるかに優れた方法のように思えます。
ガベージ コレクションを使用して ConcurrentHashMap で解決したい他の問題については、HashMap の強い参照をキーとして使用して equals() の等価性を取得し、SoftReference を値として使用して、JVM が何かをガベージ コレクションできるようにしますが、これではその場合、値は重要ではなく、SoftReference にラップしてそこに置く値がありません。したがって、equals() で SoftReference を使用するとうまくいくようです。
これに関する他の提案はありますか?