Текущая реализация SecureRandom
является поточно-ориентированной, в частности синхронизируются два метода мутации nextBytes(bytes[])
и setSeed(byte[])
.
Ну, насколько я могу судить, все методы мутации в конечном итоге направляются через эти два метода, и SecureRandom
переопределяет несколько методов в Random
, чтобы гарантировать это. Что работает, но может быть хрупким, если реализация изменится в будущем.
Лучшее решение - сначала вручную выполнить синхронизацию на экземпляре SecureRandom
. Это означает, что каждый стек вызовов получает две блокировки для одного и того же объекта, но это обычно очень дешево на современных JVM. То есть нет особого вреда в явной синхронизации себя. Например:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}