Le SecureRandom
thread est-il sûr? Autrement dit, après l'initialisation, l'accès au prochain nombre aléatoire peut-il être fiable pour être thread-safe? L'examen du code source semble montrer que c'est le cas, et ce rapport de bogue semble indiquer que son manque de documentation en tant que thread safe est un problème javadoc. Quelqu'un a-t-il confirmé qu'il était en fait thread-safe?
la source
SecureRandom
peut non seulement être lente, mais peut potentiellement se bloquer en raison d'une entropie manquanteL'implémentation actuelle de
SecureRandom
est thread-safe, en particulier les deux méthodes de mutationnextBytes(bytes[])
etsetSeed(byte[])
sont synchronisées.Eh bien, pour autant que j'ai pu le dire, toutes les méthodes de mutation sont finalement acheminées via ces deux méthodes, et
SecureRandom
remplacent quelques méthodesRandom
pour garantir cela. Ce qui fonctionne mais pourrait être fragile si la mise en œuvre est modifiée à l'avenir.La meilleure solution consiste à effectuer d'abord une synchronisation manuelle sur l'
SecureRandom
instance. Cela signifie que chaque pile d'appels acquiert deux verrous sur le même objet, mais c'est généralement très bon marché sur les JVM modernes. Autrement dit, il n'y a pas beaucoup de mal à se synchroniser explicitement. Par exemple:la source
java.security.SecureRandom#nextBytes
dans Java 8 n'est pas synchronisé. Pouvez-vous préciser dans quelle version Java avez-vous trouvé un synchronisé#nextBytes
?.