Checkstyle сообщает об этом коде как "дважды проверенная идиома блокировки", но я не думаю, что на мой код действительно влияют проблемы с двойной проверкой блокировки.
Код должен создать строку в базе данных, если строка с таким идентификатором не существует. Он работает в многопоточной среде, и я хочу избежать исключений SQL, существующих в первичном ключе.
Псевдокод:
private void createRow(int id) {
Row row = dao().fetch(id);
if (row == null) {
synchronized (TestClass.class) {
row = dao().fetch(id);
if (row == null) {
dao().create(id);
}
}
}
}
Я могу согласиться, что это похоже на двойную проверку блокировки, но я не использую статические переменные, а код в fetch () и create (), вероятно, слишком сложен, чтобы его можно было встроить и вывести из строя.
Я ошибаюсь или чекстайл? :)