在com.google.inject.AbstractModule #configure(com.google.inject.Binder)开头检查空状态的目的是什么?

时间:2016-02-12 05:49:35

标签: java guice

以下是Google guice的方法com.google.inject.AbstractModule#configure(com.google.inject.Binder)

public final synchronized void configure(Binder builder) {
  checkState(this.binder == null, "Re-entry is not allowed.");

  this.binder = checkNotNull(builder, "builder");
  try {
    configure();
  }
  finally {
    this.binder = null;
  }
}

我想知道第一个语句是否必要,因为该方法是同步的。也就是说,如果我们删除第一个语句会有什么不同吗?

修改:以下是com.google.inject.AbstractModule https://github.com/google/guice/blob/master/core/src/com/google/inject/AbstractModule.java

的源代码

1 个答案:

答案 0 :(得分:1)

非常明确:"Re-entry is not allowed.",它不允许您两次调用配置。

您需要进行空检查,因为这是一个抽象类。如果configure()的实现将调用configure(Builder),则可以再次输入该函数,因为它在同一个线程中运行,因此synchronized本身不会确保其存在。不再进入。而且BTW的同步对于空检查是必要的,所以你需要空检查和同步。