Java: Загрузите одну и ту же динамическую библиотеку в два streamа (оба streamа в одной JVM)

Я использую библиотеку (написанную на C), которая не является реентерабельной (т. Е. В библиотеке нет функции реентерабельной). Предположим, что я загрузил библиотеку через System.load, чтобы получить дескриптор «v». Я не могу использовать v в двух streamах из-за проблем с повторной загрузкой (проверенные, но бессмысленные результаты). Я мог бы использовать блокировки, но это побеждает любой параллелизм, который я мог бы получить.

То, что я хотел бы сделать, – запустить два streamа, и в каждом streamе загрузите библиотеку, чтобы получить две разные ручки (при этом есть две копии загруженной библиотеки).

Возможно ли это на Java? С уважением Саптарши

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

Ваши streamи тратят так много времени в DLL, что другого параллелизма не существует?

Это невозможно. Это было бы эквивалентно использованию POSIX dlopen т. Д. Для динамической загрузки нескольких копий библиотеки C / C ++ в программу C / C ++, и это тоже не сработает.

Основные параметры:

  • модифицируйте библиотеку C, чтобы сделать ее streamобезопасной

  • перекодировать его в (streamобезопасной) Java

  • переносить его как приложение и запускать несколько копий в виде отдельных процессов

  • оберните его как службу и запустите несколько копий, поговорив с ним, используя Sockets или соответствующий механизм RPC более высокого уровня.

Это не представляется возможным. Метод System.loadLibrary не имеет никаких аргументов или документации, которые указывали бы, что вы могли бы загружать библиотеку в зависимости от streamа или загружать одну и ту же библиотеку дважды.

Если у вас было определенное количество streamов, вы могли бы создавать несколько библиотек с немного отличающимися схемами именования. В противном случае вы, вероятно, должны просто реализовать блокировки.