Checkstyle 将此代码报告为“双重检查锁定习惯用法已损坏”,但我认为我的代码实际上并未受到双重检查锁定问题的影响。
如果不存在具有该 id 的行,则该代码应该在数据库中创建一行。它在多线程环境中运行,我想避免主键存在 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() 中的代码可能太复杂而无法内联和乱序。
我错了还是检查式?:)