У меня есть статическая HashMap, которая будет кэшировать объекты, идентифицируемые уникальными целыми числами; он будет доступен из нескольких потоков. У меня будет несколько экземпляров типа HashmapUser
, работающих в разных потоках, каждый из которых захочет использовать один и тот же HashMap (поэтому он статический).Этот поток использования HashMap безопасен?
Как правило, HashmapUsers
будет извлекаться из HashMap. Хотя, если он пуст, его необходимо заполнить из базы данных. Кроме того, в некоторых случаях HashMap будет очищен, так как он нуждается в изменении данных, и его необходимо повторно заселить.
Итак, я просто делаю все взаимодействия с картой synchhonized. Но я не уверен, что это безопасно, умно или работает для статической переменной.
Является ли нижеследующая реализация этой темы безопасной? Любые предложения по упрощению или иным улучшениям?
public class HashmapUser {
private static HashMap<Integer, AType> theMap = new HashSet<>();
public HashmapUser() {
//....
}
public void performTask(boolean needsRefresh, Integer id) {
//....
AType x = getAtype(needsRefresh, id);
//....
}
private synchronized AType getAtype(boolean needsRefresh, Integer id) {
if (needsRefresh) {
theMap.clear();
}
if (theMap.size() == 0) {
// populate the set
}
return theMap.get(id);
}
}
Любая конкретная причина, по которой вы не используете 'ConcurrentHashMap', потокобезопасную версию' HashMap'? – Powerlord
хорошо, мои проблемы параллелизма возникают из таких случаев, как: несколько потоков считают, что hashmap пуст и пытается заполнить его в одно и то же время, один поток считает, что hashmap заполнен, но к тому времени, когда он пытается извлечь из него другой поток, он очистил его , ConcurrentHashMap не решает эти проблемы. (Я думаю?) – ab11
Ваш синхронизированный бесполезен, так как у вас много экземпляров HashmapUser. Thread A получит блокировку пользователя1, а поток B получает блокировку на пользователе2, и оба одновременно получат доступ к карте. Вам нужен один объект, который будет использоваться всеми пользователями, а chich - единственный доступ к карте. И методы этого объекта - те, которые должны быть синхронизированы. –