非常に大きなオブジェクトを一度キャッシュする方法はありますか?一度しか作成できないため、キャッシュする必要がありますか?現在、私は次のようしている:大規模オブジェクトをキャッシュするためにEnumベースのシングルトンを使用する場合(Java)
public enum LargeObjectCache {
INSTANCE;
private Map<String, LargeObject> map = new HashMap<...>();
public LargeObject get(String s) {
if (!map.containsKey(s)) {
map.put(s, new LargeObject(s));
}
return map.get(s);
}
}
を私が代わりにそれを使用するすべてのクラスにLargeObjectsを渡すので、キャッシュにシングルトンを使用することを決めた理由ですLargeObjectsを、使用することができますいくつかのクラスがあります。
また、地図には多くのキー(1つまたは2つのキーが含まれていませんが、プログラムの実行によってキーが異なる場合があります)があります。
ありがとうございます。 しかし、これはスレッド安全性について言及しています。「これは通常、マップを自然にカプセル化するオブジェクトで同期することによって実現されます。オブジェクトが存在しない場合、Collections.synchronizedMapメソッドを使用してマップを " "。 同期(マップ)の使用とCollections.synchronizedMap(マップ)の使用の違い、またはConcurrentHashMapの使用の違いは何ですか?彼らはすべて同じ目標を持っているようですが、違いがなければならないと思います。 –
'synchronizedMap'(あるいは' CuncurrentMap')を使うと、オブジェクトが2回作られることになります。 'LargeObject'の作成中にマップ全体をロックするのではなく、特定のキーをロックすることができます(例えば、' Future'を使って)。しかし、コードはより複雑になります。 –
しかし、オンデマンドで原子的に作成されたインスタンスを必要とする場合、putIfAbsend()のコンカレント・コンパウンド操作はラージ・オブジェクトに対して非常にコストがかかります。 – akarnokd