목차

최근에 면접을 진행 한 곳에서 여러 질문들이 오갔지만, 제일 약한 부분이 동시성에 관한 질문이였다.
security에서의 contextholder에 저장되는인증 정보들이 비동기적 요청에 의해서 별도의 쓰레드에서 진행된다면
그 쓰레드에 담겨있는 인증 정보는 어떻게 되냐 ?
나는 이 질문에 인증정보가 쓰레드 로컬에 담겨 모든 쓰레드가 공유할 수 있다고 생각했다.
즉 그냥 "전역변수" 같은 것 아니냐? 가 내 지식의 핵심이였다ㅠㅠ
제대로된 쓰레드 로컬의 위치와 공유 방법을 몰라서 생긴 일이였다.
1. ThreadLocal

ThreadLocal은 각각의 쓰레드 별로 별도의 저장공간을 제공하는 컨테이너
멀티 쓰레드 환경에서 각각의 쓰레드에게 별도의 자원을 제공함으로써 공유되는 서비스에서 별도의 자원에 접근하게끔 하여 각각의 스레드가 각각의 상태를 가질 수 있도록 도와준다.
각자 heap에 가지고 있는 ThreadLocalMap에 저장된다!
내가 오해한 부분인 보기엔 전역 변수처럼 보이지만, 실제로는 스레드마다 따로 값을 가지는 저장소인 것이다.
1-1.만약 인증을 ThreadLocal이 아닌 전역변수나 싱들톤으로 구현한다면?
인증은 Thread A가 있는데 Thread B도 접근이 허가된다!
인증이 완료된 시점에서 싱글톤이나 전역변수로 사용하게 된다면 내부 자원들도 모두 공유되기 때문에, 다른 쓰레드의 자원을 모두가 공유할 수 있게 되는 문제가 생기는 것이다.
자원이 공유되는 것 뿐아니라 Thread B에서 인증 정보의 암호를 변경이라도 하면 더 큰 문제가 된다.
이러한 이유들로 각각의 쓰레드가 공통된 객체 내부에서도 다른 상태를 가지길 바라면서 나온 개념이 ThreadLocal이다.
메모리 구조의 독립적이라는 뜻은 아니다!
heap에 저장된다는데 왜 독립적이라고 말하는 지 모르겠었는데 이해가 되었다!