자바 동시성-ThreadLocal 클래스
ThreadLocal 클래스는 동일한 스레드에서만 읽고 쓸 수있는 스레드 로컬 변수를 만드는 데 사용됩니다. 예를 들어, 두 스레드가 동일한 threadLocal 변수에 대한 참조가있는 코드에 액세스하는 경우 각 스레드는 다른 스레드에서 수행 한 threadLocal 변수에 대한 수정 사항을 볼 수 없습니다.
ThreadLocal 메서드
다음은 ThreadLocal 클래스에서 사용할 수있는 중요한 메서드 목록입니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public T get() 이 스레드 로컬 변수의 현재 스레드 복사본에있는 값을 반환합니다. |
2 | protected T initialValue() 이 스레드 로컬 변수에 대한 현재 스레드의 "초기 값"을 반환합니다. |
삼 | public void remove() 이 스레드 로컬 변수에 대한 현재 스레드의 값을 제거합니다. |
4 | public void set(T value) 이 스레드 로컬 변수의 현재 스레드 복사본을 지정된 값으로 설정합니다. |
예
다음 TestThread 프로그램은 ThreadLocal 클래스의 이러한 메서드 중 일부를 보여줍니다. 여기서 우리는 두 개의 카운터 변수를 사용했습니다. 하나는 일반 변수이고 다른 하나는 ThreadLocal입니다.
class RunnableDemo implements Runnable {
int counter;
ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();
public void run() {
counter++;
if(threadLocalCounter.get() != null) {
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
} else {
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo commonInstance = new RunnableDemo();
Thread t1 = new Thread(commonInstance);
Thread t2 = new Thread(commonInstance);
Thread t3 = new Thread(commonInstance);
Thread t4 = new Thread(commonInstance);
t1.start();
t2.start();
t3.start();
t4.start();
// wait for threads to end
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (Exception e) {
System.out.println("Interrupted");
}
}
}
그러면 다음과 같은 결과가 생성됩니다.
산출
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
카운터 값은 스레드마다 증가하지만 threadLocalCounter는 각 스레드에 대해 0으로 유지됩니다.