ThreadLocal
하나의 쓰레드에서 객체를 전파하는 방법으로 파라미터를 사용하기 않고 코드에서 동일한 객체를 사용할 수 있게 해준다.

활용 예)
- 객체를 쓰레드에 안전하게 해준다.
- 쓰레드 단위로 트랜잭션 컨텍스트를 관리하고자 할때 사용.
(static으로 선언된 ThreadLoacl 변수에 트랜잭션 컨텍스트를 넣어두면 쓰레드에 안전하게 사용가능)
- ThreadLocal을 사용하여 공유 데이터를 사용할 때 현재 실행중인 스레드의 정보를 넘겨줘야 할 필요는 없지만, 이런 방법은 해당 프레임웍에 대한 의존성을 가지고 된다.
- 전역변수처럼 사용되기 때문에 일반적인 전역 변수가 갖는 단점처럼 재사용성을 떨어뜨릴 수 있고, 객체 간에 눈에 보이지 않는 연결 관계를 만들어내기 쉽기 때문에 애플리케이션에 어떤 영향을 미치는지 정확하게 알고 사용해야 한다.

사용 예)

ThreadLocalClass.java
public class ThreadLocalClass {

    public static ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();
}

WorkerRunnable.java
- ThreadLocal 변수 사용
- 객체는 할당한 쓰레드에서만 사용할 수 있다.
public class WorkerRunnable implements Runnable {

    private String name;
  
    public WorkerRunnable(String name) {
        this.name = name;      
    }
  
    public void setObject() {
        UserInfo info = new UserInfo();
        info.setName(name);      
        ThreadLocalClass.local.set(info);
    }
  
    @Override
    public void run() {
        setObject();

        while(true) {
            Business business = new Business();
          business.logic_01();
        }
    }
}

Business.java
- 객체 사용
public class Business {

    public void logic_01() {
        UserInfo user = ThreadLocalClass.local.get();
        System.out.println(Thread.currentThread().getName() + ":" + user.getName());
    }
}

UserInfo.java
- 데이터 객체
public class UserInfo {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } 
}

Launcher.java
- 테스트 클래스
public class Launcher {

    public static void main(String[] args) {      
              
        for(int i = 0;i<10;i++) {
            WorkerRunnable w = new WorkerRunnable("bbaeggar : " + i);
            Thread t = new Thread(w);
            t.start();
        }
    }
}

Posted by 짱가쟁이