La implementación actual de SecureRandomes 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 SecureRandomanula algunos métodos Randompara 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 SecureRandominstancia 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);
}