Проблема параллелизма при вызове нативной библиотеки через JNA - PullRequest
3 голосов
/ 08 августа 2011

Для существующего Java-приложения (которого у меня нет исходного кода) я разрабатываю плагин, который вызывает общую библиотеку. К сожалению, эта общая библиотека ( написана на C ) не является поточно-ориентированной.

Приложение вызывает мой плагин в нескольких параллельных потоках, следовательно, разделяемая библиотека вызывается этими параллельными потоками и, естественно, выдает много ошибок из-за параллелизма (например, предотвращается открытие уже открытых файлов и т. Д.)

Я получаю доступ к общей библиотеке через JNA . У меня даже есть исходный код этой общей библиотеки, но преобразование в поточно-ориентированную библиотеку займет много времени и в настоящее время невозможно. Существуют ли другие предлагаемые способы преодоления этой проблемы?

Все нативные функции доступны только из одного метода Java, поэтому я думаю, что решение синхронизированный может быть решением. Вы бы согласились?

Я пробовал это, но, к сожалению, проблема не решена. В файле журнала я все еще вижу, что метод Java вызывается одновременно, и поэтому мои собственные попытки решить эту проблему потерпели неудачу.

1 Ответ

2 голосов
/ 08 августа 2011

Да, использование синхронизации было бы правильным решением для этого.

Если вы сделаете это и все еще увидите параллельный доступ, то есть (как минимум) две возможные причины:

  • вы не всегда синхронизируете один и тот же объект (например, ваш метод synchronized, но он нестатичен и вызывается для разных объектов) или
  • несколько экземпляров классас собственным вызовом загружаются (на самом деле это подтип первого).
...