gpt4 book ai didi

java - 这是损坏的双重检查锁定吗?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:38 26 4
gpt4 key购买 nike

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() 中的代码可能太复杂而无法内联和乱序。

是我错了还是checkstyle? :)

最佳答案

我认为在这种情况下,checkstyle 是正确的。在您提供的代码中,考虑如果两个线程在同步块(synchronized block)的入口处都具有 row == null 会发生什么。线程 A 将进入 block ,并插入新行。然后线程A退出 block 后,线程B会进入 block (因为它不知道刚刚发生了什么),并尝试再次插入相同的新行。

我看到您刚刚更改了代码并在其中添加了一个非常重要的缺失行。在 代码中,您或许可以避免这种情况,因为两个线程不会依赖于对共享(静态)变量的更改。但是您最好还是看看您的 DBMS 是否支持诸如 INSERT OR UPDATE 之类的语句。

将此功能委派给 DBMS 的另一个很好的理由是,如果您需要部署多个应用程序服务器。由于 synchronized block 不能跨机器工作,因此在这种情况下您无论如何都必须做一些其他事情。

关于java - 这是损坏的双重检查锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/330178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com