沙箱静态字段

时间:2011-11-03 10:17:04

标签: java multithreading static

我必须使用一个数字库,其代码是从FORTRAN生成的。生成的代码非常快,但它只由static方法组成。问题是这些方法有副作用(它们改变静态字段),因此与多线程不兼容。

有没有办法沙箱? (每个线程看到不同的类)

PS:更改库不是一个选项,因为生成的代码不是人类友好的。 (实际上原来的FORTRAN代码也不是人类友好的)

2 个答案:

答案 0 :(得分:2)

我认为您可以从库源中删除所有static关键字和类名称,方法调用之前(如果生成的代码使用类名限定静态方法)。这两个操作都是简单的查找和替换,因此您无需了解生成的代码。

然后,每个线程都可以拥有自己的库类实例。

如果这不是一个选项,也许您可​​以使用Thread.setContextClassLoader()为每个线程提供自己的自定义ClassLoader。每个ClassLoader都有单独的类定义,所以这样也许你可以达到你想要的结果。

答案 1 :(得分:0)

不是直接访问类,而是将其加载到新的ClassLoader中,然后通过反射调用您感兴趣的方法。对static字段的更改将仅反映在ClassLoader中的类副本中。您可以处置它然后再创建另一个来再次加载该类并再次调用。

使用反射有点工作,当然不是一个长期的解决方案,但是你可以通过操纵哪个ClassLoader来保持它来隔离一个类。