[java] SecureRandom 스레드는 안전합니까?

SecureRandom스레드 안전은? 즉, 초기화 후 다음 난수에 대한 액세스가 스레드 안전을 위해 신뢰할 수 있습니까? 소스 코드를 살펴보면 이것이 사실임을 알 수 있으며, 이 버그 보고서 는 스레드로부터 안전한 문서가 부족하다는 것이 javadoc 문제임을 나타내는 것 같습니다. 실제로 스레드로부터 안전하다는 것을 확인한 사람이 있습니까?



답변

네, 그렇습니다. 그것은 Random항상 사실상의 스레드 세이프 구현을 가지고있는을 확장 하고, 자바 7에서 명시 적으로 스레드 안전성을 보장합니다.

많은 스레드가 단일을 사용하는 경우 SecureRandom성능을 저하시키는 경합이있을 수 있습니다. 반면에 SecureRandom인스턴스 초기화는 상대적으로 느릴 수 있습니다. 전역 RNG를 공유하는 것이 가장 좋은지 각 스레드에 대해 새 RNG를 만드는 것이 가장 좋은지 여부는 응용 프로그램에 따라 다릅니다. ThreadLocalRandom클래스를 지원하는 솔루션을 제공하는 패턴으로 사용될 수있다 SecureRandom.


답변

현재 구현 SecureRandom스레드 안전, 특히 두 돌연변이 방법이다 nextBytes(bytes[])setSeed(byte[])동기화된다.

글쎄, 내가 말할 수있는 한, 모든 mutating 메서드는 결국이 두 메서드를 통해 라우팅 SecureRandom되고 Random이를 보장하기 위해 몇 가지 메서드를 재정의 합니다. 어느 것이 작동하지만 향후 구현이 변경되면 깨질 수 있습니다.

가장 좋은 해결책은 SecureRandom먼저 인스턴스 에서 수동으로 동기화하는 것 입니다. 즉, 각 호출 스택이 동일한 객체에 대해 두 개의 잠금을 획득하지만 일반적으로 최신 JVM에서는 매우 저렴합니다. 즉, 자신을 명시 적으로 동기화하는 데 큰 해가되지 않습니다. 예를 들면 :

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }


답변