Мне приходится работать с множеством классов, которые используются для хранения данных в ConcurrentHashMap и обычно выглядят так:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
public class Data {
private ConcurrentHashMap<String, SomeObject> concurrentHashMap = new ConcurrentHashMap<String, SomeObject>();
private ReentrantLock lock = new ReentrantLock();
public void add(String string, SomeObject someObject) {
try {
lock.lock();
concurrentHashMap.put(string, someObject);
}
finally {
lock.unlock();
}
public void remove(String string) {
try {
lock.lock();
concurrentHashMap.remove(string);
}
finally {
lock.unlock();
}
public SomeObject get(String string) {
try {
lock.lock();
return concurrentHashMap.get(string);
}
finally {
lock.unlock();
}
}
- блокировка вообще нужна? Потому что моя интуиция говорит, что это не так.
это, вероятно, требует отдельного вопроса, но если ConcurrentHashMap содержит изменяемые значения, безопасно ли их изменять? допустим, у SomeObject есть изменяемые поля, и я делаю что-то вроде
SomeObject someObject = data.get(someString); someObject.setMutableField(someValue); data.remove(someString); data.add(someString, so);
это было бы потокобезопасным? (здесь уже ответил Каков предпочтительный способ изменить значение в ConcurrentHashMap? и здесь Вызывает ли повторное помещение объекта в ConcurrentHashMap отношение памяти" происходит раньше "?)
в некоторых из этих классов ConcurrentHashMap изменчив - имеет ли смысл делать ConcurrentHashMap изменчивым?