对于现有的Java应用程序(我没有源代码),我正在开发一个调用共享库的插件。 不幸的是,这个共享库(用C 编写)不是线程安全的。
应用程序在几个并发线程中调用我的插件,因此共享库由这些并发线程调用,并且由于并发性,它自然会产生许多错误(例如:已经打开的文件被阻止打开等)
我通过JNA 访问共享库。我甚至拥有这个共享库的源代码,但转换为线程安全库将非常耗时,目前无法实现。 还有其他建议的方法可以解决这个问题吗?
所有本机函数只能从一种Java方法访问,所以我认为使这种方法同步可能是解决方案。你同意吗?
我试过这个,但不幸的是问题没有解决。在日志文件中,我仍然看到Java方法被同时调用,因此我自己解决这个问题的努力都失败了。
答案 0 :(得分:2)
是的,使用同步将是一个有效的解决方案。
如果你这样做并且仍然看到并发访问,那么(至少)有两个可能的原因:
synchronized
,但它是非静态的并且在不同的对象上调用)或