ThreadLocal 클래스는 액세스 인터페이스나 get 및 set과 같은 메서드를 제공하는 ThreadLocalVariable(스레드 로컬 변수)로 이해될 수 있습니다. 이러한 메서드는 변수를 사용하는 각 스레드에 대해 독립적인 복사본을 저장하므로 get은 항상 현재 실행 위치를 반환합니다. thread.set를 호출할 때 설정된 최신 값입니다. ThreadLocal<T>은 해당 스레드에 특정한 값을 보유하는 Map<Thread,T> 객체를 포함하는 것으로 생각할 수 있습니다.
요약하자면, 다중 스레드 리소스 공유 문제에 대해 동기화 메커니즘은 "시간을 공간으로 교환"하는 방법을 채택하는 반면 ThreadLocal은 "공간을 시간으로 교환"하는 방법을 채택합니다. 전자는 액세스를 위해 대기할 여러 스레드에 대한 변수 복사본만 제공하는 반면, 후자는 각 스레드에 대한 변수 복사본을 제공하므로 서로 영향을 주지 않고 동시에 액세스할 수 있습니다.
모의 스레드 로컬
다음과 같이 코드 코드를 복사합니다.
import java.util.Collections;
java.util.HashMap 가져오기;
java.util.Map 가져오기;
공개 클래스 SimpleThreadLocal<T> {
private Map<Thread, T> valueMap = 컬렉션
.synchronizedMap(new HashMap<Thread, T>());
공개 무효 집합(T newValue) {
valueMap.put(Thread.currentThread(), newValue); // ①키는 스레드 객체이고 값은 이 스레드의 변수 복사본입니다.
}
공개 T get() {
스레드 currentThread = Thread.currentThread();
T o = valueMap.get(currentThread); // ② 이 스레드에 해당하는 변수를 반환합니다.
if (o == null && !valueMap.containsKey(currentThread)) { // ③Map에 없으면 Map에 넣고 저장합니다.
o = 초기값();
valueMap.put(currentThread, o);
}
반환 오;
}
공개 무효 제거() {
valueMap.remove(Thread.currentThread());
}
보호된 T 초기값() {
null을 반환;
}
}
유틸리티ThreadLocal
다음과 같이 코드 코드를 복사합니다.
클래스 수 {
개인 SimpleThreadLocal<Integer> 개수 = 새로운 SimpleThreadLocal<Integer>() {
@보수
보호된 정수initialValue() {
0을 반환합니다.
}
};
공개 정수 증가() {
count.set(count.get() + 1);
return count.get();
}
}
TestThread 클래스는 Runnable을 구현합니다.
개인 카운트 카운트;
공개 TestThread(개수 개수) {
this.count = 개수;
}
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
for (int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName() + "/t" + i
+ "일/t" + count.increase());
}
}
}
공개 클래스 TestThreadLocal {
공개 정적 무효 메인(String[] args) {
카운트 카운트 = new Count();
스레드 t1 = new Thread(new TestThread(count));
스레드 t2 = new Thread(new TestThread(count));
스레드 t3 = new Thread(new TestThread(count));
스레드 t4 = new Thread(new TestThread(count));
t1.시작();
t2.start();
t3.start();
t4.start();
}
}
출력 복사 코드는 다음과 같습니다.
스레드-0 1번째 1
스레드-0 2번째 2
스레드-0 3일 3
스레드-3 1일 1
스레드-1 1일 1
스레드-1 2일 2일
스레드-2 1일 1
스레드-1 3일 3
스레드-3 2번째 2
스레드-3 3일 3
스레드-2 2번째 2
스레드-2 3일 3