我必须使用一堆包含static
块的静态旧式类。
这些类本身只是具有静态方法的帮助程序类。
例:
public abstract class Legacy {
protected static final String[] ARRAY;
static {
//init that ARRAY
}
public static String convert(String value) {
//makes use of the ARRAY variable
}
}
重要说明:我无法控制源,因此无法修改代码。我知道这是在构建类时的严重设计缺陷。
问题:当并发访问该类时,如果该类尚未初始化,我会从旧式类中获取异常。因此,我必须确保在应用程序启动时确保每个静态类都已正确初始化。
但是我该怎么办呢?
我尝试如下:
Legacy.class.newInstance();
但这导致以下错误:
java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
所以可能我做错了吗?
最佳答案
静态初始化器是线程安全的,因为它们只能由单个线程运行。
如果一个类由多个类加载器加载,它们可能会运行多次,但是在那种情况下,它们实际上是在初始化另一个类。
因此,您看到的问题不太可能是由于初始化不完整引起的。
您的convert
方法似乎更可能执行某些线程不安全的操作,例如修改数组。
关于java - 如何初始化静态块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28301952/