비슷하다. 기존에서,
@Slf4j
public class ThreadLocalService {
private ThreadLocal<String> nameStore = new ThreadLocal<>();
public String logic(String name){
log.info("저장 name={} -> nameStore={}", name, nameStore);
nameStore.set(name);
sleep(1000);
log.info("조회 nameStore={}", nameStore.get());
return nameStore.get();
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
nameStore를 자바에서 제공해주는 ThreadLocal이라는 객체로 생성한다.
사용법은 간단하다.
저렇게 ThreadLocal<자료형> 객체로 생성한 다음에,
local.set(데이터) 쓰기
local.get() 얻기
local.remove() 지우기
저 지우기가 따로 있는건, 안 지워주면 메모리 누수가 발생할 수도 있다고 한다.
테스트
@Slf4j
public class ThreadLocalServiceTest {
private ThreadLocalService service = new ThreadLocalService();
@Test
void field(){
log.info("main start");
Runnable userA = ()->{
service.logic("userA");
};
Runnable userB = ()->{
service.logic("userB");
};
Thread threadA = new Thread(userA);
threadA.setName("thread-A");
Thread threadB = new Thread(userB);
threadB.setName("thread-B");
threadA.start();
sleep(100);
threadB.start();
sleep(2000);
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
별로 달라진 건 없다.
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
16. 쓰레드로컬 주의사항 (0) | 2024.01.14 |
---|---|
15. 쓰레드로컬 적용 (0) | 2024.01.14 |
13. 쓰레드 로컬 소개 (0) | 2024.01.14 |
12. 동시성 문제 예시 (0) | 2024.01.14 |
11. 동시성 문제 (0) | 2024.01.14 |