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

Java 多线程正确性-不一致的同步,java,sonarqube,findbugs,Java,Sonarqube,Findbugs,这有什么问题 public final void setListValid(final List<ValidRes> listValidRes) { this.listValidRes = listValidRes; } public final void setListValid(final List listValidRes){ this.listValidRes=listValidRes; } 声纳对我喊道: xxx.listValidRes同步不一致;锁定50%的

这有什么问题

public final void setListValid(final List<ValidRes> listValidRes) {
    this.listValidRes = listValidRes;
}
public final void setListValid(final List listValidRes){
this.listValidRes=listValidRes;
}
声纳对我喊道:

xxx.listValidRes同步不一致;锁定50%的时间


有人知道我需要做什么吗?

问题中给出的代码没有同步。我假设您在
this.listValidRes
代码中的其他地方进行同步。这正是Sonar告诉你的:如果你在一个资源上同步,那么在所有的使用中都同步,或者根本不同步,让其他人来处理

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

  • 您可以选择不同步,并让客户机为此烦恼。其优点是,如果不进行同步,速度会明显加快。因此,如果您的类用于单线程设置,则最好放弃同步但是清楚地记录它不是线程安全的,否则客户端将使用它多线程并抱怨奇怪的错误

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


我想有一个
p
丢失了。现在一切就绪,很抱歉名字太长了。。我不想让它在这里混淆。我在问题中给出的代码中看不到任何同步。。。我想您可以在代码中的其他地方进行同步,而不是在这里进行同步……如果
this.listValidRes
的所有其他用法都在同步块中,请在此处进行同步,或者显式地使接口“非线程安全”且不同步。然后,客户端必须处理线程。。。这是一个设计决定,但不管怎样:你不能混合。同步或不同步,但不是“有时”。