ThreadLocal에서 스레드 풀을 만났을 때
public class TestThreadLocal {
private ThreadLocal local = new ThreadLocal<>(){
@Override
protected Integer initialValue() {
return 1;
}
};
public void getAndAdd() {
Integer integer = local.get();
System.out.println(Thread.currentThread().getName() + ": local thread values is:"+integer);
local.set(integer+1);
}
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(4);
final TestThreadLocal testThreadLocal = new TestThreadLocal();
service.submit(testThreadLocal::getAndAdd);
service.submit(testThreadLocal::getAndAdd);
service.submit(testThreadLocal::getAndAdd);
service.submit(testThreadLocal::getAndAdd);
service.submit(testThreadLocal::getAndAdd);
}
}
이 코드는 다음과 같이 인쇄됩니다.
pool-1-thread-1: local thread values is:1
pool-1-thread-3: local thread values is:1
pool-1-thread-1: local thread values is:2
pool-1-thread-4: local thread values is:1
pool-1-thread-2: local thread values is:1
두 번째로 같은 스레드를 사용할 때 이 대상은 더 이상 initialValue가 존재하지 않는다는 것을 설명합니다.
이렇게 하면 많은 상황에서 문제가 있을 것이다. 문제가 있으면 반드시 어떻게 해결해야 하는지를 찾아내야 한다. 이 종류의api를 보고 하나의 방법인remove,remove를 알게 된 후에 다음에 다시 get을 하면 initialValue를 먼저 호출할 것이다. 그래서 코드를 다음과 같이 바꾸면 ok이다.
public class TestThreadLocal {
private ThreadLocal local = new ThreadLocal<>(){
@Override
protected Integer initialValue() {
return 1;
}
};
public void getAndAdd() {
Integer integer = local.get();
System.out.println(Thread.currentThread().getName() + ": (get and add local) thread values is:"+integer);
local.set(integer+1);
}
public void get() {
System.out.println(Thread.currentThread().getName() + ": (get) local thread values is:"+local.get());
}
public void clear() {
local.remove();
}
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(4);
final TestThreadLocal testThreadLocal = new TestThreadLocal();
Runnable runnable = () -> {
testThreadLocal.getAndAdd();
testThreadLocal.get();
testThreadLocal.clear();
};
service.submit(runnable);
service.submit(runnable);
service.submit(runnable);
service.submit(runnable);
service.submit(runnable);
}
}
인쇄 결과는 다음과 같습니다.
pool-1-thread-2: (get and add local) thread values is:1
pool-1-thread-1: (get and add local) thread values is:1
pool-1-thread-3: (get and add local) thread values is:1
pool-1-thread-2: (get) local thread values is:2
pool-1-thread-3: (get) local thread values is:2
pool-1-thread-4: (get and add local) thread values is:1
pool-1-thread-1: (get) local thread values is:2
pool-1-thread-2: (get and add local) thread values is:1
pool-1-thread-2: (get) local thread values is:2
pool-1-thread-4: (get) local thread values is:2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.