Является ли SecureRandom
поточно? То есть можно ли полагаться на доступ к следующему случайному числу после его инициализации для обеспечения потоковой безопасности? Изучение исходного кода, похоже, показывает, что это так, и этот отчет об ошибке, похоже, указывает на то, что отсутствие документации в качестве потокобезопасности является проблемой javadoc. Кто-нибудь подтвердил, что это действительно потокобезопасный?
источник
SecureRandom
может быть не только медленной, но и потенциально может зависнуть из-за отсутствия энтропииТекущая реализация
SecureRandom
является потокобезопасной, в частности, два метода измененияnextBytes(bytes[])
иsetSeed(byte[])
синхронизируются.Что ж, насколько я могу судить, все методы мутации в конечном итоге маршрутизируются через эти два метода и
SecureRandom
переопределяют несколько методов,Random
чтобы гарантировать это. Что работает, но может быть нестабильным, если реализация будет изменена в будущем.Лучшее решение -
SecureRandom
сначала синхронизировать экземпляр вручную . Это означает, что каждый стек вызовов получит две блокировки для одного и того же объекта, но на современных JVM это обычно очень дешево. То есть явная синхронизация себя не представляет особого вреда. Например:источник
java.security.SecureRandom#nextBytes
в Яве 8 не синхронизируется. Не могли бы вы уточнить, в какой версии Java вы нашли синхронизированный#nextBytes
?.