Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

ThreadLocal - 예제 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

ThreadLocal - 예제

Seung__ 2021. 11. 22. 14:34

1. ThreadLocal 사용법


  • 값 저장: ThreadLocal.set(xxx)
  • 값 조회: ThreadLocal.get()
  • 값 제거: ThreadLocal.remove()
  • 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면
  • ThreadLocal.remove() 를 호출해서 쓰레드 로컬에 저장된 값을 제거해주어야 한다. 

 

 

2. ThreadLocalService


@Slf4j
public class ThreadLocalService {

    private ThreadLocal<String> nameStore = new ThreadLocal<>();

    public String logic(String name){
        log.info("저장 name={} --> nameStore={}", name, nameStore.get());
        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) {
            e.printStackTrace();
        }
    }
}

 

 

3. Test


@Slf4j
public class ThreadLocalServiceTest {

    private ThreadLocalService service = new ThreadLocalService();

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

        //Ruunable 인터페이스의 run() 구현.
        //Thread는 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하거나,
        //Runnable 인터페이스 구현 후 Thread에 주입하는 방식으로 사용 가능.
        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(2000); //동시성 문제 발생 안하는 조건.
        sleep(100); //동시성 문제 발생하는 조건.
        threadB.start();

        sleep(2000); //메인 Thread 종료 대기
        log.info("main exit");

    }

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

 

 

4. 결과


  • 각 thread마다 별도 저장소가 있기 때문에 처음 저장 시 nameStore = null.
  • 동시성 문제 발생하는 조건으로 실행했지만, threadLocal 을 사용하여 동시성 문제 해결함.
[main] - main start
[thread-A] - 저장 name=userA --> nameStore=null
[thread-B] - 저장 name=userB --> nameStore=null
[thread-A] - 조회 nameStore=userA
[thread-B] - 조회 nameStore=userB
[main] - main exit

 

 

5. GitHub : 21112 ThreadLocal


 

GitHub - bsh6463/Spring_Advanced: initial

initial. Contribute to bsh6463/Spring_Advanced development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

ThreadLocal - 적용  (0) 2021.11.22
ThreadLocal - 개발  (0) 2021.11.22
Thread Local - 소개  (0) 2021.11.22
동시성 문제 - 예제 코드  (0) 2021.11.22
필드 동기화 - 동시성 문제  (0) 2021.11.20
Comments