Thread local

Objective_chicorita·2022년 9월 13일
0

다수의 개발자들이자 잘 몰라서 활용을 잘못하는 기능이 있는데, 바로, thread 단위로 로컬 변수를 할당하는 기능이다! 이 기능은 threadlocal 클래스를 통해서 제공된다.

ThreadLocal이란?

: 일반 변수의 수명은 특정 코드 블록 범위 내에서만 유효하다. 반면에 ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에 쓰레드1에서 실행한 경우 관련 값이 쓰레드1에 저장된고 쓰레드2에 실행할 경우 쓰레드2에 저장된다는 점이다.

실생활 예시) 게임이 userA,B가 동시 접속해서 게임을 해도 userA점수는 userA 쓰레드에게 저장되고, userB점수는 userB에 저장된다.

ThreadLocal 기본 사용법

  1. ThreadLocal 객체를 생성한다.
  2. ThreadLocal.set() 메서드를 이용해서 현재 쓰레드의 로컬변수에 값을 저장한다.
  3. ThreadLocal.get() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 읽어온다.
  4. ThreadLocal.remove() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 삭제한다.
// 현재 쓰레드와 관련된 로컬변수를 생성한다.
ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();

// 로컬변수 값을 할당
local.set(currentUser);

// 이후 실행되는 코드는 쓰레드 로컬 변수 값을 사용
UserInfo userInfo = local.get();

Thread Local 활용

: 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해주기 때문에 쓰레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파해주기 위한 용도로 사용된다.
주로..

  • 사용자 인증정보 전파 - Spring Security에서는 Threadlocal을 이용해서 사용자 인증 정보를 파악한다.
  • 트랜잭션 컨텍스트 전파 - 트랜잭션 매니저는 트랜잭션 컨텍스트를 전파하는데 threadlocal을 사용한다.
  • 쓰레드에 안전해야 하는 데이터 보관

구체적인 예시) ThreadLocal 타입의 static필드를 갖는 클래스를 작성해보자

public class Context {
 	public static ThreadLocal<Date> local = new ThreadLocal<Date>();
 }
class A {
	public void a() {
    	Context.local.set(new Date());
        
        B b=new B();
        b.b();
        
        Conext.local.remove();
    }
}

class B {
	public void b() {
    	Date date = Conext.local.get();
        
        C c=new C();
    }
}

Class C{
	public void c(){
    	Date date = Context.local.get();
    }
}

2 - A.a() 메서드에서 현재 쓰레드의 로컬 변수에 Date 객체를 저장한다.
4 - B.b() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
6 - C.c() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
9 - A.a() 메서드에서 현재 쓰레드의 로컬 변수를 삭제한다.

profile
객체지향 치코리타와 함께하는 dev_travel

0개의 댓글