我必须使用一个数字库,其代码是从FORTRAN生成的。生成的代码非常快,但它只由static
方法组成。问题是这些方法有副作用(它们改变静态字段),因此与多线程不兼容。
有没有办法沙箱? (每个线程看到不同的类)
PS:更改库不是一个选项,因为生成的代码不是人类友好的。 (实际上原来的FORTRAN代码也不是人类友好的)
答案 0 :(得分:2)
我认为您可以从库源中删除所有static
关键字和类名称,方法调用之前(如果生成的代码使用类名限定静态方法)。这两个操作都是简单的查找和替换,因此您无需了解生成的代码。
然后,每个线程都可以拥有自己的库类实例。
如果这不是一个选项,也许您可以使用Thread.setContextClassLoader()
为每个线程提供自己的自定义ClassLoader。每个ClassLoader都有单独的类定义,所以这样也许你可以达到你想要的结果。
答案 1 :(得分:0)
不是直接访问类,而是将其加载到新的ClassLoader
中,然后通过反射调用您感兴趣的方法。对static
字段的更改将仅反映在ClassLoader
中的类副本中。您可以处置它然后再创建另一个来再次加载该类并再次调用。
使用反射有点工作,当然不是一个长期的解决方案,但是你可以通过操纵哪个ClassLoader
来保持它来隔离一个类。