ThreadLocal 이란 ?

업데이트:

Java ThreadLocal 이란 무엇인가 ?

개요

면접, CS기본기를 위한 개념정리 글입니다. 코드 예제 보다는 짚고 넘어가고 싶은 몰랐던 부분을 이야기 하려고 합니다.

Thread 란

프로세스 & 스레드

프로세스란 ? 실행 중인 하나의 어플리케이션

쓰레드란 ? 한 프로세스 내에서 동작 되는 여러 실행 흐름

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

자바에서 JVM 위에서 하나의 프로세스가 돌아가고, 하나의 프로세스 안에서 main문 하나의 쓰레드가 실행 된다고 생각 된다.

쓰레드는 추가 가능하다.

스레드 장단점

멀티 스레드는 멀티 프로세싱에 비해 Context switch(문맥 교환) 이라는 오버헤드가 일어나지 않는다. 또한 자원을 공유 한다. 따라서 스레드로 처리하면 프로세스끼리 통신하는 비용보다 통신 비용이 적고 , 문맥교환이 적게 발생함으로 효율적인 작업이 가능해진다.

장점

  1. CPU 사용률을 향상 시킨다.
  2. 자원을 효율적으로 사용할 수 있다.
  3. 사용자에 대한 응답성이 향상 된다. (오버헤드 저하)
  4. 코드가 간결해진다.

하지만 멀티 쓰레드가 장점만 있는것은 아니다. 대부분 문제는 멀티쓰레드는 여러 쓰레드가 하나의 프로세스 내에서 자원을 공유하면서 작업하기 떄문에 동기화(Synchronization), 교착상태(Deadlock ) 와 같은 문제들이 발생할 수가 있다.

이 문제들은 아래 Thread Safe 에서 간단하게 짚고 넘어가겠다.

Thread Safe

싱글쓰레드에서는 한개의 쓰레드가 객체를 사용하지만 멀티쓰레드 환경에서는 쓰레드들이 객체를 공유해서 작업 해야 하는 경우가 있다. 이렇게 공유 자원으로 쓰이는 영역을, 쓰레드가 동시에 접근하면 안되는 영역을 임계영역(critical section) 이라고 한다. 이 문제를 해결 하기 위해 나온 개념이 세마포어(Semaphore), 상호배제(Mutex) 등이 있다.

세마포어(Semaphore) : 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것

뮤텍스(Mutex) : 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것

어떻게 해결 할 수 있을까 ?

바로 동기화 메소드 or 동기화 블록을 사용해서 해결 할 수 있다. 자바의 동기화 키워드 (Synchronized ) 를 이용하면 현재 데이터를 사용하고 있는 해당 쓰레드를 제외하고, 나머지 쓰레드들은 데이터에 접글 할 수 없도록 막을 수 있다. 이런것을 thread-safe 환경을 만든다고 한다.

하지만 동기화키워드를 남용할 경우 프로그램 성능이 현저하게 낮아 질 수 있다.

Synchrozied 를 사용후 한 쓰레드가 공유자원에 접근 해 있을떄, 다른 쓰레드는 공유 자원에 접근 하려고 하면 wait 상태로 넘어가기 때문에 느려지게 된다.

ThreadLocal

ThreadLocal 이란?

ThreadLocal은 자바의 class 이다 . ThreadLocal 은 위에서 말했던 공유자원 문제와는 별개의 개념이다.

ThreadLocal class 는 오직 한 쓰레드에 의해서 읽고 쓰여질 수 있는 변수 라고 생각 하면 될거 같다.

두 쓰레드가 같은 코드를 실행하고 이 코드가 하나의ThreadLocal 변수를 참조 하더라도 서로의 ThreadLocal 변수를 볼 수 없다.

좀더 쉽게 말하면 ThreadLocal 변수를 선언하면 멀티쓰레드 환경에서 각 스레드마다 독립적인 변수를 가지고 접근 할 수 있다.

ThreadLocal 은 예제를 통해서 하면 금방 이해 할 수 있다.

https://javacan.tistory.com/entry/ThreadLocalUsage 에 사용법이 잘 정리 되어 있습니다.

ThreadLocal 활용

ThreadLocal은 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해주기 때문에 관련된 코드에서 파라미터를 사용하지 않고 객체를 각자가 가져다 쓸때 사용 된다.

  • 사용자 인증 정보 Spring Security 에서 사용자마다 다른 인정 정보를 사용할때 & Session정보
  • 쓰레드에 안전해야 하는 데이터를 보관 할때

ThreadLocal 주의 사항

쓰레드 로컬은 메모리 누수의 주범이 됨으로 주의 해서 사용해야 한다.

Thread pool 환경에서 ThreadLocal을 사용하는 경우 변수에 보관된 데이터 사용이 끝나면 반드시 해당 데이터를 삭제 해주어야 한다. 그렇지 않을 경우 재사용 되는 쓰레드가 올바르지 않은 데이터를 참조할 수도 있다.

댓글남기기