java - ThreadLocal

잠자는 고양이·2025년 5월 22일
0

Java

목록 보기
63/73

🧵 ThreadLocal이란?

ThreadLocal은 각 스레드가 독립적으로 데이터를 저장하고 관리할 수 있도록 해주는 Java 클래스입니다.
즉, 각 스레드마다 개별적인 변수 공간을 제공하여 공유 자원 없이도 안전하게 데이터를 유지할 수 있습니다.


🔍 특징

  • ✅ 스레드마다 독립적인 저장 공간 제공 → 동기화 문제 해결
  • ♻️ 스레드 종료 시 자동으로 데이터 제거 → 메모리 누수 방지
  • 📥 get() 호출 시 → 현재 스레드의 데이터 반환
  • 📤 set() 호출 시 → 현재 스레드의 데이터 설정

💥 왜 ThreadLocal을 사용할까?

🔧 멀티 스레드 환경의 동시성 문제

  • 여러 스레드가 공유 자원에 접근하면 다음과 같은 문제가 발생할 수 있음:
    • ⚠️ Race condition (경쟁 상태)
    • ⚠️ 데이터 불일치
    • ⚠️ Deadlock (교착 상태)

🛠️ ThreadLocal로 동시성 문제 해결

  • 스레드마다 독립적인 데이터 공간을 가지므로
  • 공유 자원 없이도 데이터 일관성 유지 가능
  • 🔒 synchronized 없이도 안전한 멀티스레드 프로그래밍 가능

🔁 ThreadLocal vs synchronized

항목ThreadLocalsynchronized
🔐 동기화 필요 여부❌ 불필요 (스레드별 독립 데이터)✅ 필요 (공유 자원 보호)
⚡ 성능✅ 빠름 (락 없음)❌ 느림 (락 획득 대기 필요)
🔗 데이터 공유❌ 불가능✅ 가능
🧰 사용 예시사용자 인증, 트랜잭션 관리 등공유 데이터 수정 필요할 때

⚠️ ThreadLocal 사용 시 메모리 누수 주의

원인

  1. ThreadLocal은 Thread 내부의 ThreadLocalMap에 데이터 저장

    • 키: ThreadLocal 객체
    • 값: 실제 데이터
  2. 스레드 풀 사용 시

    • 스레드가 계속 재사용되며, ThreadLocal 값이 계속 유지될 수 있음
    • 이전 작업의 값이 메모리에 남아 신규 작업에 영향을 줄 수 있음

🧹 주의 사항

  • 반드시 remove() 호출하여 ThreadLocal 값 제거
    메모리 누수 방지
  • 스레드가 종료되지 않으면 데이터가 계속 남아 있을 수 있음

🔁 ThreadLocal 대안: ConcurrentHashMap

  • 모든 스레드가 공유하는 저장소가 필요한 경우
    ConcurrentHashMap이 더 적절

예시: ThreadLocal처럼 사용하기

ConcurrentHashMap<Long, Object> map = new ConcurrentHashMap<>();
map.put(Thread.currentThread().getId(), myData);
profile
개발자가 되고 싶은 잠자는고양이

0개의 댓글