У меня есть HashMap объектов с вложенными списками ArrayLists, доступ к которым осуществляется несколькими потоками.
Мне интересно, достаточно ли объявления его как синхронизированного HashMap, чтобы сделать его поточно-ориентированным.
public class ExampleRepository {
private static Map<String, Example> examples = Collections.synchronizedMap(new HashMap<>());
public static void addExample(Example example) {
examples.put(example.getKey(), example);
}
public static Example getExample(String key) {
return examples.get(key);
}
}
public class Example {
private String key;
// More attributes
private List<AnotherObject> anotherObjectList = new ArrayList<>();
// Constructor
public List<AnotherObject> getAnotherObjectList() {
return anotherObjectList;
}
// More getters & Setters
}
public class Doer {
// This function runs in an ExecutorService with many threads
public static one(String key) {
Example example = ExampleRepository.getExample(key);
if (example != null) {
// Do stuff
example = new Example(values);
AnotherObject anotherObject = new AnotherObject(values);
example.getAnotherObjectList().add(anotherObject);
ExampleRepository.addExample(example);
}
two(example);
}
private static two(Example example) {
// Do stuff
AnotherObject anotherObject = new AnotherObject(values);
trim(example.getAnotherObjectList(), time);
example.getAnotherObjectList().add(anotherObject);
}
private static void trim(List<AnotherObject> anotherObjectList, int time) {
short counter = 0;
for (AnotherObject anotherObject : anotherObjectList) {
if (anotherObject.getTime() < time - ONE_HOUR) {
counter++;
} else {
break;
}
}
if (counter > 0) {
anotherObjectList.subList(0, counter).clear();
}
}
}
Я предполагаю, что вопрос заключается в добавлении объектов-примеров кHashMap поток безопасно? Кроме того, удаление и добавление объектов AnotherObject в многопоточный список безопасным для потоков или я должен объявить его как синхронизированный ArrayList?
Я был бы очень признателен за любые идеи. Большое спасибо!
Большое спасибо за ответы. Я только что понял, что я на самом деле зацикливаюсь на вложенном AnotherObject. Если я сделаю ArrayList синхронизированным ArrayList, должен ли я все же поместить его в синхронизированный блок?
Еще раз спасибо!