Google Guava Cache を使用して ConcurrentHashMaps のスレッドセーフなシングルトン キャッシュを作成しようとしています。これらの各マップにはリストが含まれます。リストは、リストに追加できるすべてのスレッドが実行された後、一度だけ読み取られます。私の実装 (具体的にはアイテムを更新する場所) がスレッドセーフかどうか、またはそれを改善する方法を考えています。同期ブロックを使用せずにこれを行うより良い方法はありますか?
public enum MyCache {
INSTANCE;
private static Cache<Integer, ConcurrentHashMap<String, List>> cache =
CacheBuilder.newBuilder()
.maximumSize(1000)
.build();
private static AtomicInteger uniqueCount = new AtomicInteger(0);
private final Object mutex = new Object();
//Create a new unique ConcurrentHashMap
public Integer newMapItem(){
Integer key = uniqueCount.incrementAndGet();
//We dont care if something exists
cache.put(
key,
new ConcurrentHashMap<String, List>()
);
return key;
}
public void expireMapItem(int key){
cache.invalidate(key);
}
public Integer add(int cacheKey, String mapListKey, int value){
synchronized(mutex){
ConcurrentMap<String, List> cachedMap = cache.getIfPresent(cacheKey);
if (cachedMap == null){
//We DONT want to create a new map automatically if it doesnt exist
return null;
}
List mappedList = cachedMap.get(mapListKey);
if(mappedList == null){
List newMappedList = new List();
mappedList = cachedMap.putIfAbsent(mapListKey, newMappedList);
if(mappedList == null){
mappedList = newMappedList;
}
}
mappedList.add(value);
cachedMap.replace(mapListKey, mappedList);
cache.put(
cacheKey,
cachedMap
);
}
return value;
}
}