답변:
네, 그렇습니다. 그것은 Random
항상 사실상의 스레드 세이프 구현을 가지고있는을 확장 하고, 자바 7에서 명시 적으로 스레드 안전성을 보장합니다.
많은 스레드가 단일을 사용하는 경우 SecureRandom
성능을 저하시키는 경합이있을 수 있습니다. 반면에 SecureRandom
인스턴스 초기화는 상대적으로 느릴 수 있습니다. 전역 RNG를 공유하는 것이 가장 좋은지 각 스레드에 대해 새 RNG를 만드는 것이 가장 좋은지 여부는 응용 프로그램에 따라 다릅니다. ThreadLocalRandom
클래스를 지원하는 솔루션을 제공하는 패턴으로 사용될 수있다 SecureRandom
.
SecureRandom
뿐만 아니라 수 느릴 수 있지만, 잠재적으로가 없기 때문에 엔트로피의 걸 수
현재 구현 SecureRandom
스레드 안전, 특히 두 돌연변이 방법이다 nextBytes(bytes[])
과 setSeed(byte[])
동기화된다.
글쎄, 내가 말할 수있는 한, 모든 mutating 메서드는 결국이 두 메서드를 통해 라우팅 SecureRandom
되고 Random
이를 보장하기 위해 몇 가지 메서드를 재정의 합니다. 어느 것이 작동하지만 향후 구현이 변경되면 깨질 수 있습니다.
가장 좋은 해결책은 SecureRandom
먼저 인스턴스 에서 수동으로 동기화하는 것 입니다. 즉, 각 호출 스택이 동일한 객체에 대해 두 개의 잠금을 획득하지만 일반적으로 최신 JVM에서는 매우 저렴합니다. 즉, 자신을 명시 적으로 동기화하는 데 큰 해가되지 않습니다. 예를 들면 :
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}
java.security.SecureRandom#nextBytes
Java 8에서는 동기화되지 않습니다. 동기화 된 Java 버전을 지정해 주 #nextBytes
시겠습니까?.