4

这有什么问题……?

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

声纳对我大喊:

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

有谁知道我需要做什么?

4

1 回答 1

17

问题中给出的代码没有同步。我假设您this.listValidRes在代码中的其他地方同步。这正是 Sonar 告诉您的内容:如果您对资源进行同步,请在所有用途上进行同步,或者根本不这样做,让其他人处理它。

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

  • 您可以选择同步并让客户端打扰它。优点是如果没有同步,它会明显更快。因此,如果您的类在单线程设置中使用,最好放弃同步。但是清楚地记录它不是线程安全的,否则客户端使用它多线程并抱怨奇怪的错误......

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

于 2013-05-28T15:56:07.783 回答