Hello, Freakin world!

[Java] ThreadLocal 간단하게 정리 본문

프로그래밍 언어/Java

[Java] ThreadLocal 간단하게 정리

johnna_endure 2021. 3. 9. 17:14

간단하게 비유하자면 이 클래스는 Map<Thread, R> 처럼 동작합니다.

 

스레드의 참조를 키 값으로 하기 때문에 같은 ThreadLocal이 여러 스레드에 공유되어 값을 저장해도 특정 스레드에 저장된 값이 다른 스레드에 의해 영향받지 않습니다.

 

간단한 예제 코드로 확인해보겠습니다.

 

import org.junit.jupiter.api.Test;

public class TestThreadLocal {

    ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "default");

    @Test
    public void test() throws InterruptedException {
        threadLocal.set("main");


        Thread myThread = new Thread(() -> {
            threadLocal.set("hello");
            System.out.println(threadLocal.get());
        });
        myThread.start();

        Thread.sleep(1000);
        System.out.println(threadLocal.get());

    }

}

 

 테스트 메서드 첫 줄에서 ThreadLocal에 "main"이라는 문자열을 저장했습니다.

그리고 자식 스레드 하나를 만들고 ThreadLocal의 참조를 전달한 다음, 자식 스레드 컨텍스트에서 threadLocal.set("hello")과 .get()을 호출해 값을 콘솔에 찍어냅니다.

자식 스레드에서 hello로 값을 저장했음에도 불구하고 부모 스레드에 다시 main이라는 값을 반환하네요.

생각대로 동작되는 듯합니다.

 

한 가지 더 확인해볼까요?

 

만약 아래처럼 자식스레드에서 값을 set하지 않도록하면 어떤 값이 출력될까요?

 

import org.junit.jupiter.api.Test;

public class TestThreadLocal {

    ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "default");

    @Test
    public void test() throws InterruptedException {
        threadLocal.set("main");


        Thread myThread = new Thread(() -> {
            //threadLocal.set("hello");
            System.out.println(threadLocal.get());
        });
        myThread.start();

        Thread.sleep(1000);
        System.out.println(threadLocal.get());

    }

}

 

혹시 이전에 저장했던 값인 main이 출력될지도 모르니 눈으로 직접 확인해봅시다.

 

휴~

예상대로 동작하네요. 굳~

Comments