티스토리 뷰

Backend/Java

Random vs. ThreadLocalRandom

ellie.strong 2022. 2. 17. 22:41
728x90

리뷰어 희봉이 "Random과 ThreadLocalRandom의 차이점이 무엇일까요?"라는 질문을 던져주셨다. 🙇‍♀️

 

나는 그동안 Random를 사용하면서도 이에 대한 정확한 학습이나 이것 보다 더 적절한 라이브러리는 없는지에 대한 생각을 한적이 없었다. 

덕분에 Java 표준 라이브러리에서 제공하는 랜덤 넘버 생성 기능이 Random, ThreadLocalRandom, SecureRandom 등 다양하다는 것을 알게 되었다. (추가 학습이 필요하다!!)

 

Java7부터 다중 스레드 프로그램을 위한 ThreadLocalRandom이 추가되었다. 

 

ThreadLocalRandom는 Random과 같은 기능을 제공하면서도 다음과 같은 장점을 가진다. 

  1. 스레드 세이프(Thread Safe)하다.
  2. 다중 스레드 프로그램에서 Random의 성능 저하를 보완한다. 

 [이펙티브 자바 3/E]에서는 ThreadLocalRandom 사용을 추천하고 있다. 

 

기존의 Random 사용 코드를 ThreadLocalRandom을 사용하는 방식으로 변경하였으며, 테스트 코드를 추가하였다. 

 

before

public static int pickRandomNumber() {
    return new Random().nextInt(END_EXCLUSIVE);
}

after

public static int pickRandomNumber() {
    return ThreadLocalRandom.current().nextInt(END_EXCLUSIVE);
}
@SuppressWarnings("NonAsciiCharacters")
public class RandomNumberGeneratorTest {

    @Test
    void 랜덤_넘버_생성_확인() {
        int randomNumber = RandomNumberGenerator.pickRandomNumber();
        assertThat(randomNumber)
                .isGreaterThanOrEqualTo(0)
                .isLessThanOrEqualTo(9);
    }
}

 

Ref.

https://www.baeldung.com/java-thread-local-random

https://jithub.tistory.com/363

http://dveamer.github.io/backend/JavaRandom.html

728x90
댓글
공지사항
최근에 올라온 글