(2) Random v.s. ThreadLocalRandom
About
바로 이전 글 (1) Math.random() v.s. Random에서 java.lang.Math.random()
과 java.util.Random
의 차이를 알아보았다. 둘 중에서는 후자를 쓰자는 것으로 결론을 내렸는데, Random
도 성능 상의 문제가 있다. 이번엔 ThreadLocalRandom
을 알아보자.
java.util.Random
Java 1.0부터 존재했다. Thread-safe하지만 여러 쓰레드에서 동시 접근하면 경합이 발생하여 성능이 저하된다.
java.util.concurrent.ThreadLocalRandom
ThreadLocalRandom
은 쓰레드별로 격리된 난수생성기(Random Number Generator)이다.
Random
도 thread-safe하고 ThreadLocalRandom
도 thread-safe하지만 이유가 다르다.
Random
은 seed를AtomicLong
을 사용하므로, 멀티쓰레드 요청에 대해서도 순서대로 처리해 마치 동기화(synchronized) 처리처럼 동작하기 때문에 느리다. (동기화 방식처럼 동작하므로 thread-safe하다.)ThreadLocalRandom
은AtomicLong
을 사용하지 않고, 쓰레드별로 seed값을 다르게 관리하므로Random
보다 쓰레드에 대해 응답이 빠르고 thread-safe하다.
결론: JDK 7부터 Random
을 사용할 필요가 없다. ThreadLocalRandom
을 쓰면 된다.
Code
+ java.util.SplittableRandom
SplittableRandom
은 격리된 병렬처리에 특화된 난수생성기이다.
Thread-safe하지 않으므로 주의가 필요하다.
특정 상황에서는
ThreadLocalRandom
보다 유리하다.해당 내용은 REF를 참고하자.
More on the matter
REF
dveamer - Java Random - ThreadLocalRandom, SplittableRandom, SecureRandom
정리가 매우 잘 된 글이다. 모든 핵심 내용을 여기서 참고한다.
Last updated