最佳答案
我使用一个静态代码块来初始化一个注册表中的一些控制器。因此,我的问题是,我能否保证这个静态代码块只在类首次加载时绝对被调用一次?我知道我不能保证什么时候调用这个代码块,我猜测它是在 Classloader 第一次加载它的时候。我意识到我可以在静态代码块中的类上进行同步,但我猜想这实际上是怎么发生的呢?
简单的代码示例如下;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
或者我应该这样做;
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}