ThreadLocal 과 동시성 문제
ThreadLocal
1. 동시성 문제
싱글톤으로 등록된 스프링 빈을 사용할 때 생각을 안할 수 없는 것은 바로 동시성 문제이다.
FieldLogTrace 라는 싱글톤으로 등록된 스프링 빈이 있다.
이 객체의 인스턴스가 애플리케이션에 딱 1개만 존재한다는 뜻이다.
이렇게 하나만 있는 인스턴스의 FieldLogTrace.traceIdHolder(필드)를 여러 쓰레드가 동시에 접근한다면 어떤 문제가 발생할까? , 이러한 문제가 바로 동시성 문제이다.
실무에서 한번 나타나면 개발자를 가장 괴롭히는 문제이기도한데, 이러한 동시성 문제를 해결하기 위해 쓰레드 로컬을 사용할 수 있다.
쓰레드 로컬에는 중요한 주의사항이 있는데, 사용후에 반드시 remove해줘야한다는 것이다.
그렇지 않으면 사용한 쓰레드가 삭제되지않고 쓰레드풀에 들어갔다가 다른 사용자에게 재호출 되기때문에 다른 사람에게 이전에 쓰레드로컬을 사용하였던 사람의 정보가 노출 될 수 있다.
그렇기 때문에 이 작업은 필터나 인터셉터같은 부분에서 나갈때 clear해서 깔끔하게 제거해주는 작업을 해주면 좋다.
또한 여러 스레드가 공유하는 데이터가 아니라고 하더라도, ThreadLocal 변수에 대한 동시성 문제가 발생할 수 있는데 예를 들어, ThreadLocal을 사용하여 캐싱을 구현할 때 여러 스레드가 동시에 해당 캐시 값을 변경할 수 있게 되므로, 이는 잘못된 동작을 유발할 수 있습니다.
이렇듯 싱글톤으로 이루어진 스프링 빈에서 빠질수 없는 기술이지만, 스레드 동기화 및 관리에 대한 주의가 필요합니다, 올바른 초기화와 사용 그리고 정리가 중요하며, 스레드 풀 등 동시성 환경에서 사용할 때는 특히 더 많은 주의가 필요합니다.