我正在构造函数和声纳中初始化静态字段,指示"静态字段的延迟初始化应该同步"。
public class Person {
static Set<String> names;
public Person() {
names = createSet();// Sonar warning here
}
}
我知道我们可以使用synchronize关键字在setter中解决它。但是如果在构造函数的情况下如何解决这个问题?
答案 0 :(得分:1)
uniqueStates = unique(data$State)
uniqueProducts = unique(data$Product)
for i in 1:length(uniqueStates) {
for j in 1:length(uniqueProducts) {
data_subset = subset(data, data$State == uniqueStates[i] & data$Product == uniqueProducts[j])
model <- auto.arima(data_subset$Sales)
result = forecast(model,3)
# Store the result in a Data Frame
}
}
你必须检查两次。因为如果两个线程进入外部public class Person {
static Set<String> names;
public Person() {
if (names == null) {
synchronized (Person.class) {
if (names == null)
names = createSet();
}
}
}
if语句,那么内部检查也会过滤掉。这种类型的检查称为if(names == null)
。请参阅this.
答案 1 :(得分:0)
也许这会有所帮助:
public class Person {
static Set<String> names;
public Person() {
if (names == null) {
synchronized (Person.class) {
names = createSet();
}
}
}
但是,说实话,这个结构看起来有点奇怪。为什么人有静态名字?我可能会考虑改变架构。
答案 2 :(得分:0)
如果集合初始化一次,最好在声明处执行,以避免使用synchronized,因为它会降低性能。 JVM总是在任何事情之前初始化字段。
public class Person {
static Set<String> names = createSet();
public Person() {
}
}