【发布时间】:2015-11-12 19:23:08
【问题描述】:
我在我的程序中使用了一个包含大量静态方法的库。我想并行(多线程)运行一些调用这些静态方法的代码。这会导致一个问题,因为只有一个静态类实例在线程之间共享。这会导致崩溃。是否可以为每个线程创建该库的实例?我无法更改库中的任何代码,因为它是封闭源代码。
我线程中的run方法:
public void run(){
for (String formula : input) {
try {
Formula converted = (Formula) logic.createExpression(formula);
System.out.println(converted);
Formula cnf = ClassicalLogic.Utilities.conjunctiveForm(converted, true);
if (cnf.toString().equals("true")) {
convertedFormulae.add(ClassicalLogic.Utilities.conjunctiveForm(converted));
} else {
convertedFormulae.add(cnf);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
converter.threadReady(convertedFormulae);
}
问题出在这条线:
Formula cnf = ClassicalLogic.Utilities.conjunctiveForm(converted, true);
我真正想要的是如何为每个线程创建一个单独的 ClassicalLogic.Utilties 实例?
【问题讨论】:
-
我没有发现问题;实际错误是什么?静态方法本身不是问题,但静态字段中的共享数据是。
-
是的,问题是这个静态方法改变了 Utilities 类中一些静态字段的值,导致在一些线程中抛出 NullPointerExceptions,因为多个线程同时更改了数据。
-
处理它的一种方法是为 ClassicalLogic.Utilties 创建您自己的代理类,并同步所有方法,并使用您的类而不是 ClassicalLogic.Utilties。但是,如果您需要在单个线程中执行数据完整性,这将无济于事。或者,您可以为每个线程使用不同的类加载器,并通过线程的类加载器在每个线程中显式加载 ClassicalLogic.Utilities。然后从技术上讲,您将拥有同一类的不同版本,并且它们不会共享静态成员。
-
@Peter L 谢谢!我该怎么做?
标签: java multithreading static