다수의 개발자들이자 잘 몰라서 활용을 잘못하는 기능이 있는데, 바로, thread 단위로 로컬 변수를 할당하는 기능이다! 이 기능은 threadlocal 클래스를 통해서 제공된다.
: 일반 변수의 수명은 특정 코드 블록 범위 내에서만 유효하다. 반면에 ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에 쓰레드1에서 실행한 경우 관련 값이 쓰레드1에 저장된고 쓰레드2에 실행할 경우 쓰레드2에 저장된다는 점이다.
실생활 예시) 게임이 userA,B가 동시 접속해서 게임을 해도 userA점수는 userA 쓰레드에게 저장되고, userB점수는 userB에 저장된다.
// 현재 쓰레드와 관련된 로컬변수를 생성한다.
ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();
// 로컬변수 값을 할당
local.set(currentUser);
// 이후 실행되는 코드는 쓰레드 로컬 변수 값을 사용
UserInfo userInfo = local.get();
: 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해주기 때문에 쓰레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파해주기 위한 용도로 사용된다.
주로..
구체적인 예시) 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() 메서드에서 현재 쓰레드의 로컬 변수를 삭제한다.