假设我有一个创建对象并使用静态变量跟踪对象数量的类。像这样:
public class Apple {
private static int count = 0;
public Apple () {
count++;
}
public void removeApple() {
count--;
}
}
当我使用 FindBugs 检查此代码时,我收到警告 Write to static field from instance method
,这当然很明显。
我怎样才能解决这个问题并使其更安全,甚至摆脱 FindBugs 警告?
最佳答案
1。一般编程建议
这条消息是为了警告您一个潜在的编程错误,因为对于不了解静态变量和实例变量范围差异的初学者程序员来说,这是一个常见的陷阱。 p>
但是,如果您可以声明removeApple
方法的真实版本static
而不会导致任何编译器错误,那么您很可能应该这样做。这既会处理警告,又会明确表明此方法与您的类的任何特定实例无关。
2。与并发相关的问题
此警告的另一方面涉及线程安全。如果您从实例写入 static
字段,则可能会从不同的线程进行并发更新,即使线程之间没有共享类实例也是如此。
如果您的代码不需要线程安全(一般情况下这完全没问题),那么您无需执行任何操作。如果确实需要,则同步该字段的所有更新,或使用 AtomicInteger
包装器。
就我个人而言,我会选择 AtomicInteger
,因为它是最安全的选择:其他选项需要您跟踪类周围的所有字段更新并确保它们是同步的。使用 AtomicInteger
非常简单:
private static final AtomicInteger count = new AtomicInteger();
然后您使用 count.getAndIncrement()
而不是 count++
。
关于java - 如何在 Java 中安全地写入静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422691/