2018년 4월 17일 화요일

ThreadLocal 개념

ThreadLocal

  • static한 객체한테 thread별로 같은 쓰레드 안에서는 값을 유지해 준다.
  • 동일한 쓰레드라면 파라미터로 넘기지않아도 값을 꺼낼 수 있다. 
  • ThreadLocal을 사용하려면 static으로 사용한다. static이 아니면 매번 필드가 메모리에 만들어 진다.
  • RequestContextHolder는 내부적으로 ThreadLocal이 구현되어 있다.

public class MyContext{
    public static ThreadLocal threadLocalValue = new ThreadLocal<>();
    public static int value;
}

package examples;

import examples.util.MyContext;

public class Test {
    public static void main(String[] args){
        MyThread myThread1 = new MyThread(100);
        MyThread myThread2 = new MyThread(200);
        myThread1.start();
        myThread2.start();
    }
}

class MyThread extends Thread{
    int i ;
    public MyThread(int i){
        this.i = i;
    }
    public void run(){
        while(true) {
            MyContext.threadLocalValue.set(i);
//            MyContext.value = i;
            MyService service = new MyService();
            service.print(i);
            try {
                Thread.sleep((int)(Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyService{
    public void print(int i){
        int k = MyContext.threadLocalValue.get();
//        int k = MyContext.value;
        System.out.println(i + " : " + k);
    }
}

Share:

0 개의 댓글:

댓글 쓰기