[JAVA] 쓰레드(Thread)

EB·2024년 1월 23일

📌프로세스란?

실행중인 프로그램

📌쓰레드란?

프로세스 내에서 실제로 작업을 수행 하는 주체

  • 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행

  • 두 개 이상의 스레드를 가지는 프로세스 -> 멀티스레드 프로세스

📌쓰레드 풀

미리 일정 개수의 쓰레드를 생성하여 관리하는 기법

  • 작업을 할당받기 위해 대기 상태에 있다가, 작업이 발생되면 대기중인 쓰레드를 하나 할당받아 작업 수행
  • 작업이 종료되면 다시 대기 상태로 돌아가고, 다시 작업을 할당 받을 준비를 한다.

👌 쉽게 이해하기

  • 프로세스 - 공장
  • 쓰레드 - 일꾼
  • A가 캐리어를 보관하기 위해 짐보관소로 가서 짐 맡기기를 요청 -> 직원이 보관소(쓰레드풀)에서 있다가 직원A(쓰레드)가 개인 사물함(쓰레드로컬)에 A의 짐을 보관해준다.

📌쓰레드 로컬 생성

ThreadLocal<String> threadLocal = new ThreadLocal<>();

📌쓰레드 로컬 읽기/쓰기

threadLocal.set("aaa") // 값 저장
threadLocal.get() // 저장된 값 불러오기

📌쓰레드 로컬 제거

threadLocal.remove()

📌쓰레드 로컬 주의사항

쓰레드 로컬의 값을 사용 후 제거하지 않고 그냥 두면 WAS(톰캣)처럼 쓰레드 풀을 사용하는 경우에 심각한 문제가 발생할 수 있다. 아래 내용을 참고해보자

1. 사용자A가 저장 HTTP요청 -> WAS가 쓰레드 풀에서 쓰레드 하나 조회

1-1. thread-A가 할당 -> thread-A에 사용자A데이터를 쓰레드 로컬에 저장
1-2. 쓰레드 로컬의 thread-A 전용 저장소에 사용자A 데이터 보관

2.사용자A 저장 요청 종료

 2-1.사용자A HTTP 응답 종료 -> WAS가 사용 종료된 thread-A를 쓰레드풀에 반환.(쓰레드 생성비용이 비싸기때문에 보통 쓰레드풀을 통해 쓰레드 재사용)
 2-2.threadA는 쓰레드풀에서 살아있으므로, thread-A 전용 보관소에서도 사용자A의 정보가 남아있다.

3.사용자B 조회 요청

3-1.사용자B가 조화를 위해 새로운 HTTP 요청 -> WAS는 쓰레드풀에서 쓰레드 하나 조회
3-2.thread-A가 할당되었다(다른 쓰레드가 할당 될 수도 있다.)
3-3.조회요청이기때문에 thread-A가 쓰레드 로컬에서 데이터를 조회한다.
3-4.쓰레드 로컬은 thread-A 전용 보관소에 저장되어있던 사용자A의 정보를 반환한다.
3-5.사용자B가 사용자A의 정보를 조회하게 된다. (문제발생!!!🚨)

👩‍💻 중요!!! 쓰레드 로컬 값을 Thread.remove()를 통해 꼭 제거해줘야한다.

profile
👩‍💻✨junior developer

0개의 댓글