应该同步惰性字段的初始化

时间:2015-11-12 19:49:23

标签: constructor lazy-initialization

我正在构造函数和声纳中初始化静态字段,指示"静态字段的延迟初始化应该同步"。

public class Person {
static Set<String> names;
 public Person() {
    names = createSet();// Sonar warning here
  }
}

我知道我们可以使用synchronize关键字在setter中解决它。但是如果在构造函数的情况下如何解决这个问题?

3 个答案:

答案 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() {

}
}