多线程正确性 - 同步不一致

时间:2013-05-28 14:50:59

标签: java sonarqube findbugs

这有什么不对......?

public final void setListValid(final List<ValidRes> listValidRes) {
    this.listValidRes = listValidRes;
}

声纳叫喊我:

Inconsistent synchronization of xxx.listValidRes; locked 50% of time

有谁知道我需要做什么?

1 个答案:

答案 0 :(得分:14)

问题中给出的代码没有同步。我假设您在代码中的其他位置this.listValidRes进行同步。正是这就是Sonar告诉你的:如果你在资源上进行同步,那就在所有用法上进行,或者根本不做,并让其他人处理它。

基本上这是一个设计决定:

  • 您可以选择同步并让客户端烦恼。优点是没有同步它会明显更快。因此,如果您的类在单线程设置中使用,那么抛弃同步会更好。 但是明确记录为线程安全或客户使用多线程并抱怨奇怪的错误......

  • 如果选择(或必须)同步,则在每次使用关键资源时执行此操作。有不同的方法来实现这一目标。也许您想要显示您实际上已同步的资源的用法。也许我或其他人可以给你一些好的建议。