La implementación actual de SecureRandom
es segura para subprocesos, específicamente los dos métodos mutantes nextBytes(bytes[])
ysetSeed(byte[])
están sincronizados.
Bueno, por lo que he podido decir, todos los métodos de mutación eventualmente se enrutan a través de esos dos métodos y SecureRandom
anula algunos métodos Random
para garantizar eso. Lo cual funciona, pero podría resultar frágil si se cambia la implementación en el futuro.
La mejor solución es sincronizar manualmente en la SecureRandom
instancia primero. Esto significa que cada pila de llamadas adquirirá dos bloqueos en el mismo objeto, pero eso suele ser muy económico en las JVM modernas. Es decir, no hay mucho daño en sincronizarse explícitamente. Por ejemplo:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}