В настоящее время я использую ConcurrentHashMap, в котором храню некоторые файлы на основе уникального идентификатора, который я генерирую, используя org.apache.commons.lang.RandomStringUtils#randomAlphanumeric
.Как правильно сгенерировать уникальный идентификатор и сохранить его в ConcurrentHashMap
Мой текущий подход заключается в следующем:
private ConcurrentHashMap <String, CustomFile> fileIdMap =
new ConcurrentHashMap <String, SwitchConfigurationFile>();
public void importFile() {
CustomFile file = new CustomFile (generateFileID(), param1, param2, param3, param4);
fileIdMap.put (file.getID(), file);
}
private String generateFileID() {
String generatedValue = RandomStringUtils.randomAlphanumeric(5);
while (fileIdMap.containsKey(generatedValue)) {
generatedValue = RandomStringUtils.randomAlphanumeric(5);
}
//I was thinking here to put the generated value into the Map
//but at this moment I don't have the CustomFile instance
//and null values are not allowed
//maybe:
//fileIdMap.put (generatedValue, new CustomFile());
return generatedValue;
}
Я думал: Что делать, если fileIdMap.containsKey(generatedValue)
возвращает ложное и, прежде чем я добавить его к карте другой поток приходит и добавляет тот же ключ, у меня будет один CustomFile в вместо двух. Я знаю, что шансы очень малы, но я хочу принять это во внимание.
Итак, каков наилучший подход в этой ситуации и как я могу гарантировать, что у меня также есть уникальный идентификатор для каждого файла?
Вам действительно нужно сгенерировать идентификатор как отдельную операцию? –