(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하다.)

  • ThreadLocalRandomAtomicLong을 사용하지 않고, 쓰레드별로 seed값을 다르게 관리하므로 Random보다 쓰레드에 대해 응답이 빠르고 thread-safe하다.

결론: JDK 7부터 Random을 사용할 필요가 없다. ThreadLocalRandom을 쓰면 된다.

Code

ThreadLocalRandomTest.java
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomTest {
    public static void main(String[] args) {
        int rand = ThreadLocalRandom.current().nextInt(100);
        System.out.println(rand); // 99
    }
}

+ java.util.SplittableRandom

SplittableRandom은 격리된 병렬처리에 특화된 난수생성기이다.

  • Thread-safe하지 않으므로 주의가 필요하다.

  • 특정 상황에서는 ThreadLocalRandom보다 유리하다.

  • 해당 내용은 REF를 참고하자.

More on the matter

REF

Last updated