Java ThreadLocal 예
Java ThreadLocal은 스레드 로컬 변수를 만드는 데 사용됩니다. 객체의 모든 스레드는 변수를 공유하므로 변수는 스레드로부터 안전하지 않습니다. 스레드 안전을 위해 동기화를 사용할 수 있지만 동기화를 피하려면 ThreadLocal
변수를 사용할 수 있습니다.
자바 스레드로컬

Java ThreadLocal 예
다음은 Java 프로그램에서 ThreadLocal의 사용을 보여주고 모든 스레드가 자신의 ThreadLocal 변수 복사본을 가지고 있음을 증명하는 작은 예입니다. ThreadLocalExample.java
package com.journaldev.threads;
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable{
// SimpleDateFormat is not thread-safe, so give one to each thread
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
public static void main(String[] args) throws InterruptedException {
ThreadLocalExample obj = new ThreadLocalExample();
for(int i=0 ; i<10; i++){
Thread t = new Thread(obj, ""+i);
Thread.sleep(new Random().nextInt(1000));
t.start();
}
}
@Override
public void run() {
System.out.println("Thread Name= "+Thread.currentThread().getName()+" default Formatter = "+formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//formatter pattern is changed here by thread, but it won't reflect to other threads
formatter.set(new SimpleDateFormat());
System.out.println("Thread Name= "+Thread.currentThread().getName()+" formatter = "+formatter.get().toPattern());
}
}
위의 Java ThreadLocal 예제 프로그램의 출력은 다음과 같습니다.
Thread Name= 0 default Formatter = yyyyMMdd HHmm
Thread Name= 1 default Formatter = yyyyMMdd HHmm
Thread Name= 0 formatter = M/d/yy h:mm a
Thread Name= 2 default Formatter = yyyyMMdd HHmm
Thread Name= 1 formatter = M/d/yy h:mm a
Thread Name= 3 default Formatter = yyyyMMdd HHmm
Thread Name= 4 default Formatter = yyyyMMdd HHmm
Thread Name= 4 formatter = M/d/yy h:mm a
Thread Name= 5 default Formatter = yyyyMMdd HHmm
Thread Name= 2 formatter = M/d/yy h:mm a
Thread Name= 3 formatter = M/d/yy h:mm a
Thread Name= 6 default Formatter = yyyyMMdd HHmm
Thread Name= 5 formatter = M/d/yy h:mm a
Thread Name= 6 formatter = M/d/yy h:mm a
Thread Name= 7 default Formatter = yyyyMMdd HHmm
Thread Name= 8 default Formatter = yyyyMMdd HHmm
Thread Name= 8 formatter = M/d/yy h:mm a
Thread Name= 7 formatter = M/d/yy h:mm a
Thread Name= 9 default Formatter = yyyyMMdd HHmm
Thread Name= 9 formatter = M/d/yy h:mm a
출력에서 볼 수 있듯이 Thread-0이 formatter의 값을 변경했지만 여전히 thread-2 기본 formatter는 초기화된 값과 동일합니다. 다른 스레드에서도 동일한 패턴을 볼 수 있습니다. 업데이트: ThreadLocal 클래스는 공급업체 기능 인터페이스를 인수로 사용하는 새로운 메서드 withInitial()
로 Java 8에서 확장됩니다. 따라서 람다 식을 사용하여 ThreadLocal 인스턴스를 쉽게 만들 수 있습니다. 예를 들어 위의 포맷터 ThreadLocal 변수는 아래와 같이 한 줄에 정의할 수 있습니다.
private static final ThreadLocal<SimpleDateFormat> formatter =
ThreadLocal.<SimpleDateFormat>withInitial
(() -> {return new SimpleDateFormat("yyyyMMdd HHmm");});
Java 8 기능을 처음 사용하는 경우 API 문서를 확인하십시오.