Многократное добавление поставщика безопасности в приложение Java

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

java.security.Security
            .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

Мои вопросы:

  1. Нужно ли добавлять поставщика безопасности в приложение несколько раз? Служит ли это какой-либо цели? Для меня это не имеет смысла, и достаточно добавить его один раз.
  2. Это кандидат на потенциальную утечку памяти в приложении?

Чтобы уточнить, я хочу добавить провайдера безопасности Bouncy Castle программно в свое приложение, а не статически через JRE. IMO, достаточно добавить провайдера безопасности Bouncy Castle один раз в приложение, и мне не нужно делать это несколько раз.


person Aman    schedule 19.07.2017    source источник


Ответы (1)


Согласно javadoc addProvider :

Возвращает:
предпочтительную позицию, в которой был добавлен провайдер, или -1, если провайдер не был добавлен, потому что он уже установлен

addProvider уже проверяет, установлен ли поставщик, поэтому, даже если у вас есть несколько вызовов в вашем приложении, он будет добавлен только один раз. И после того, как вы добавите его, он останется там до тех пор, пока JVM не остановится (или если кто-то позвонит removeProvider).

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

Я работал с системами, которые имели более одного вызова addProvider в разных частях (поскольку они могли вызываться в любом порядке и были независимы друг от друга), все работали в одной и той же JVM, и никогда не было утечек памяти. Конечно, это только мой случай, но я не знаю, что это вызывает утечки.


Если вы хотите позвонить addProvider только в том случае, если провайдер еще не добавлен, вы можете позвонить Security.getProvider(), чтобы проверить это. Если поставщик не находится в JVM, он возвращает null:

// add provider only if it's not in the JVM
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
    Security.addProvider(new BouncyCastleProvider());
}
person Community    schedule 19.07.2017
comment
Обратите внимание, что из-за ошибки вы должны использовать стиль загрузки «только добавить, если нет». Ошибка: bugs.openjdk.java.net/browse/JDK-8168469 - person beat; 27.03.2019