Песочница статических полей - PullRequest
0 голосов
/ 03 ноября 2011

Я должен использовать числовую библиотеку, код которой генерируется из FORTRAN.Результирующий код очень быстрый, но он сделан из класса только с static методами.Проблема в том, что методы имеют побочный эффект (они изменяют статические поля) и, следовательно, не совместимы с многопоточностью.

Есть ли способ изолировать их?(Каждый поток видит свой класс)

PS: изменение библиотеки не вариант, так как сгенерированный код не удобен для человека.(на самом деле оригинальный код FORTRAN также не подходит для людей)

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Я думаю, что вы могли бы просто удалить все ключевые слова static и имя класса из до вызова методов (если сгенерированный код квалифицирует статические методы с именем класса) из источников библиотеки. Обе операции просты: найти и заменить, поэтому вам не нужно понимать сгенерированный код.

Тогда у каждого потока может быть свой экземпляр класса библиотеки.

Если это не вариант, возможно, вы могли бы предоставить каждому потоку свой собственный ClassLoader, используя Thread.setContextClassLoader(). Каждый ClassLoader имеет отдельные определения классов, так что, возможно, таким образом вы сможете достичь желаемого результата.

0 голосов
/ 03 ноября 2011

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

Это небольшая работа с отражением, и, конечно, это не долгосрочное решение, но да, вы можете изолировать класс таким способом, манипулируя тем, какой ClassLoader содержит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...