• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Java 정리] ThreadLocal
        2022년 10월 19일
        • starryeye
        • 작성자
        • 2022.10.19.:22
        반응형

        java.lang.ThreadLocal 에 대해 알아보자.

         

        쓰레드 로컬은..

        자바에서..

        싱글톤 객체의 필드를 사용하면서, 동시성 문제를 해결하는 방법이다.

         

        각 쓰레드마다 별도의 내부 저장소를 제공하여,

        동일한 인스턴스의 로컬 필드에 각 쓰레드가 접근해도 동시성 문제가 없다.

         

         

        예시를 보며.. 알아보자.

         

        ThreadLocalService라는 클래스는 아래 ThreadLocalServiceTest 클래스에서

        하나의 인스턴스로 두개의 쓰레드에서 사용된다.

        ThreadLocal의 String 타입으로 nameStore를 정의하였다.

         

        set메서드와 get 메서드 사이 간격은 1초간격이다.

         

        ThreadLocal 클래스는 다음과 같은 메서드를 제공한다...

        ThreadLocal.set(...) : 값 저장에 사용

        ThreadLocal.get() : 값 조회에 사용

        ThreadLocal.remove() : 값 제거에 사용

         

         

        앞서 개발한 ThreadLocalService 객체를 사용하는 ThreadLocalServiceTest 클래스이다.

         

        Runnable 인터페이스를 람다식으로 구현하였다. (run 메서드)

        ThreadLocalService의 logic 함수를 호출 하는데 넘겨주는 String값을 각기 다르게 하였다.  (18 ~ 24 line)

         

        Runnable 구현체를 각 쓰레드 이름을 부여하며, 두개의 쓰레드로 생성하였다.

        (26 ~ 29 line)

         

        두 쓰레드를 0.1초간격으로 실행 하였다. (31 ~ 33 line)

        -> ThreadLocal 변수로 개발했기 때문에 동시성 문제는 발생되지 않는다..

        -> Thread-A는 userA로 정상 조회, Thread-B는 userB로 정상 조회.

         

        하지만..

        ThreadLocal 변수가 아니라 일반 String 변수로 했다면..

        -> 0.1초간격으로 실행하였기 때문에 ThreadLocal 변수가 아니면, 동시성 문제가 발생한다.

        -> ThreadLocal 변수가 아니면, Thread-A의 조회 로그에서 userB라고 출력된다.

        (ThreadLocalService의 logic 함수 내부 set, get 간격이 1초이다.)

         

         

        주의 사항

        쓰레드 풀을 사용할 경우 주의 사항이 있다.

        쓰레드 풀은 쓰레드가 사용되고 삭제되지 않고 쓰레드 풀에 반환되고..

        다음에 쓰레드가 필요할 경우.. 재사용된다.

        여기서 문제가 발생된다.

         

        기존에 쓰레드로컬 변수를 한번 사용했던 쓰레드라면..

        쓰레드가 반환되고 재사용 되는 시점에... 쓰레드 로컬 변수에 값이 살아있기 때문에

        의도하지 않은 문제가 발생될 수 있다.

         

        따라서..

        쓰레드를 반환하기 직전에는

        쓰레드 로컬 변수의 값을 반드시 삭제하고 반환해야한다.

        (ThreadLocal.remove() 사용)

         

         

        추후 포스팅 예정..

        -> ThreadLocal 동작 원리..

        반응형

        'Java' 카테고리의 다른 글

        불변 객체 validation  (1) 2023.05.07
        불변 객체, lombok @Value 와 Java Record  (0) 2023.05.07
        [Java 정리] Thread 6  (0) 2022.08.22
        [Java 정리] Thread 5  (0) 2022.08.22
        [Java 정리] Thread 4  (0) 2022.08.22
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바