У меня есть Java Потокобезопасная карту, которая хранит строки в объект отображения:Безопасна ли следующая реализация?
ConcurrentHashMap<String, MyObject> map = new ConcurrentHashMap<>();
Здесь MyObject является определенный пользователем класс. Теперь рассмотрим следующий метод:
public void replace(String key, MyObject o) {
MyObject m = map.get("somekey");
synchronized(m) {
// Modify some internal components of m
// and some other objects related to m
}
}
Моя цель здесь, я хочу, чтобы максимизировать производительность, не ставя блокировку на весь класс, но только на нитях, которые пытаются получить доступ к одной клавиши на карте. В основном каждый раз, когда запись заменяется на карте (не добавляется), эта часть кода выполняется. Что-то вроде:
public void put(String key, MyObject o) {
if (map.putIfAbsent(key, o) == null){ //do something
}
else {
replace(key, o);
}
}
Для всех практических целей мы можем предположить, что это единственный метод, с помощью которого ссылка на MyObject может быть изменен. Безопасна ли эта реализация?
Это невозможно узнать без реализации «MyObject», и если можно получить доступ к этому конкретному экземпляру по-другому. Но простой ответ: возможно, нет. –
@MarkRotteveel Я согласен, что мой вопрос был неполным. Теперь я добавил несколько подробностей. – Sohaib
Я потерял 'replace' и' put' оба в вашем коде? –