У меня есть ситуация, когда вызывающие абоненты хотели бы получить объект из компонента в зависимости от текущего экземпляра (идентификатора). Теперь, если объект текущего компонента существует для текущего экземпляра, он не должен быть создан снова. Таким образом, есть два пути (я думаю), это может быть сделано -Который должен использоваться - ConcurrentHashMap putIfAbsent или блокировка карты
1. Using putIfAbsent of ConcurrentHashMap
beanObject = objectFactory.get(); // this will create new instance every time
// even if not required
beanObject = beanMapForInstance.putIfAbsent(name, beanObject);
return beanObject;
Или
2. By Locking the map
beanObject = beanMapForInstance.get(name); // beanMapForInstance is a ConcurrentHashMap
if(beanObject == null){
synchronized (beanMapForInstance) {
beanObject = beanMapForInstance.get(name);
if(beanObject == null){
beanObject = objectFactory.getObject();
beanMapForInstance.put(name, beanObject);
}
}
}
return beanObject;
В первый метод создается новый объект каждый раз, так что я думаю, что второй должен быть предпочтительным. Но findbugs показывает проблему для второго варианта синхронизации, выполняемой на ConcurrentHashMap, и какой из них следует использовать?
Ну, блокировка не повлияет на какой-либо другой код, но выше pattern2 будет работать до тех пор, пока никто другой не имеет доступа к карте (который предположительно является закрытым для этого класса менеджера компонентов). Объект блокировки также может быть полностью несвязанным объектом блокировки (не обязательно должна быть сама карта). На самом деле, это, вероятно, предпочтительнее для ясности. – Thilo
'computeIfAbsent' приятно. – Thilo
Если кто-то еще не использует ConcurrentHashMap, зачем его использовать? Просто используйте блокировку HashMap, которая даст такую же, если не лучшую производительность, как синхронизацию ConcurrentHashMap. –