스프링/스프링 핵심 원리 - 고급편

14. 쓰레드로컬 예시

sdafdq 2024. 1. 14. 21:16

비슷하다. 기존에서,

@Slf4j
public class ThreadLocalService {
    private ThreadLocal<String> nameStore = new ThreadLocal<>();

    public String logic(String name){
        log.info("저장 name={} -> nameStore={}", name, nameStore);
        nameStore.set(name);
        sleep(1000);
        log.info("조회 nameStore={}", nameStore.get());
        return nameStore.get();
    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

nameStore를 자바에서 제공해주는 ThreadLocal이라는 객체로 생성한다.

 

사용법은 간단하다.

저렇게 ThreadLocal<자료형> 객체로 생성한 다음에,

 

local.set(데이터) 쓰기

local.get() 얻기

local.remove() 지우기

 

저 지우기가 따로 있는건, 안 지워주면 메모리 누수가 발생할 수도 있다고 한다. 

 

 

테스트

@Slf4j
public class ThreadLocalServiceTest {
    private ThreadLocalService service = new ThreadLocalService();

    @Test
    void field(){
        log.info("main start");

        Runnable userA = ()->{
            service.logic("userA");
        };

        Runnable userB = ()->{
            service.logic("userB");
        };

        Thread threadA = new Thread(userA);
        threadA.setName("thread-A");
        Thread threadB = new Thread(userB);
        threadB.setName("thread-B");

        threadA.start();
        sleep(100);
        threadB.start();
        sleep(2000);
    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

별로 달라진 건 없다.

 

 

'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글

16. 쓰레드로컬 주의사항  (0) 2024.01.14
15. 쓰레드로컬 적용  (0) 2024.01.14
13. 쓰레드 로컬 소개  (0) 2024.01.14
12. 동시성 문제 예시  (0) 2024.01.14
11. 동시성 문제  (0) 2024.01.14