실행중인 프로그램
프로세스 내에서 실제로 작업을 수행 하는 주체
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행
두 개 이상의 스레드를 가지는 프로세스 -> 멀티스레드 프로세스
미리 일정 개수의 쓰레드를 생성하여 관리하는 기법
👌 쉽게 이해하기
- 프로세스 - 공장
- 쓰레드 - 일꾼
- 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의 정보를 조회하게 된다. (문제발생!!!🚨)