2011-08-08 16 views
2

既存のJavaアプリケーション(ソースコードはありません)では、共有ライブラリを呼び出すプラグインを開発しています。 残念ながら、この共有ライブラリ(はCで書かれています)はスレッドセーフではありません。JNA経由でネイティブライブラリを呼び出す際の同時性問題

アプリケーションは共有ライブラリがこれらの並列スレッドによって呼び出され、自然にそれが(例:すでにオープンしているファイルは、などを開くことが防止されている)の同時実行のために多くのエラーを与えているので、複数の同時実行スレッド内私のプラグインを呼び出している

JNA経由で共有ライブラリにアクセスしています。私はこの共有ライブラリのソースコードを持っていますが、スレッドセーフなライブラリへの変換は時間がかかり、現時点では不可能です。 この問題を解決する他の方法がありますか?

すべてのネイティブ関数

が唯一のJavaメソッドからアクセスされているので、私は同期この方法 を作ることは解決策になることができると思います。同意しますか?

私はこれを試しましたが、残念ながら問題は解決されません。ログファイルでは、Javaメソッドが同時に呼び出されていることがわかります。したがって、これを解決するための自分の努力が失敗しました。

答えて

2

はい、これを有効にするには、同期を使用するのが有効です。

その後、(少なくとも)2つの原因があり、あなたがそれを行うとはまだ同時アクセスが表示される場合があります

  • あなたは常にあなたの方法は​​である(たとえば、同じオブジェクトで同期していません、それは非静的であり、別のオブジェクトで呼び出されます)、またはネイティブ・コールを持つクラスの複数のインスタンスがロードされます(実際にはこれは最初のサブタイプです)。
+0

はい私のメソッドは静的ではありませんでした。静的に変更しましたが、今問題は解決されているようです。ありがとうございます... – user544799

+3

JNAはネイティブメソッドが同時に呼び出されないようにNative.synchronizedLibrary(Library)を提供しています。 – technomage

関連する問題