동시성 문제와 스레드 로컬

MIIN·2022년 12월 28일
0

동시성 이슈란?

두 개 이상의 스레드가 동시에 같은 자원에 접근해 값을 변경할 때 발생할 수 있는 문제를 의미한다.

스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리한다.
따라서 멀티 스레드 환경에서 여러 스레드가 같은 인스턴스 필드에 접근하면서 트래픽이 많아질 때 동시성 문제가 발생할 수 있다.

지역 변수의 경우 스레드마다 각각 다른 메모리 영역이 할당되므로 동시성 문제가 발생하지 않는다.
같은 인스턴스의 필드 또는 static과 같은 공용 필드에 접근할 때 주로 발생한다.

싱글톤 패턴(Singleton pattern)

최초 한 번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.

생성자가 여러 번 호출되더라도 실제로 생성되는 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

고정된 메모리 영역을 얻으면서 한 번 생성한 객체를 사용하기 때문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있다.

Thread

프로세스란 실행 중인 하나의 어플리케이션을 말하고, 스레드는 한 프로세스 내에서 동작되는 여러 실행 흐름이다.

즉, 프로세스는 운영체제로부터 할당받는 작업 단위이며, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위다.

ThreadLocal

해당 스레드만 접근할 수 있는 별도의 내부 저장소를 제공한다. 따라서 같은 인스턴스의 스레드 로컬 필드에 접근해도 문제가 발생하지 않는다.

이 때 스레드 로컬에 저장된 값을 제거해주지 않으면 다른 사용자의 값에 접근할 수 있기 때문에 꼭 ThreadLocal.remove()를 이용해 값을 제거해줘야 한다.

0개의 댓글