【发布时间】:2010-10-27 02:05:51
【问题描述】:
我正在使用静态代码块来初始化我拥有的注册表中的一些控制器。因此,我的问题是,我可以保证这个静态代码块在第一次加载类时绝对只会被调用一次吗?我知道我无法保证何时调用此代码块,我猜是 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) {
// ...
}
}
【问题讨论】:
-
我不喜欢这种设计,因为它无法测试。看看依赖注入。
标签: java multithreading static synchronization static-initializer