Я читал все и наоборот о использовании Java ConcurrentHashMap. Надеюсь, мой вопрос поможет прояснить то, что выглядит просто (с актуальными ответами).Как выполнять операции сопоставления сопоставленных объектов?
У меня есть карта, как это:
ConcurrentHashMap<Integer, ClassA> map = new ConcurrentHashMap<Integer, ClassA>()
Я использую ConcurrentHashMap, чтобы поместить и получить операции поточно. Мой ClassA имеет некоторые атрибуты Integer/String и Collection of Strings.
Теперь я хотел бы знать, как безопасно обновлять отображаемый объект. Если я хочу, чтобы создать метод для обновления объекта из моей карты путем добавления новой строки, у меня есть что-то вроде:
synchronized(map)
{
Collection<String> strings = map.get(id).getStrings();
if(!strings.contains(newString)) //strings can't be null
{
strings.add(newString);
}
}
Является ли этот код безопасным против одновременного чтения/записи? Можно ли это сделать по-другому, используя Java API?
Возможно, у вашего примера есть некоторые ошибки. Прямо сейчас код внутри синхронизированного блока не имеет ничего общего с картой. Существует переменная с именами событий, но я не знаю, что это такое - я думаю, это ваша карта. Если это так, то вам действительно не нужно синхронизировать карту. Извлеките эту логику, вставьте ее в ClassA, а затем выполните некоторую синхронизацию. – bbankowski
Действительно, я обновил описание с правильным именем. Это действительно моя карта. Я надеялся синхронизировать карту, чтобы фактически заблокировать всю таблицу и предотвратить любые одновременные изменения моих сопоставленных объектов. Можете ли вы уточнить «некоторую синхронизацию»? – TBag
Простейшим способом было бы создать обычный метод void synchronized add (String newString) в вашем классе. Одновременные изменения экземпляров ClassA будут синхронизированы, и вам не придется синхронизировать их на карте. – bbankowski