싱글톤으로 등록된 FieldLogTrace 빈에서 인스턴스의 필드, 또는 static 같은 공용 필드에 동시에 접근할 때 발생
테스트 코드 예시
public class FieldServiceTest {
private FieldService fieldService = new FieldService();
@Test
void field() {
log.info("main start");
Runnable userA = () -> {
fieldService.logic("userA");
};
Runnable userB = () -> {
fieldService.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(3000);
log.info("main exit");
}
}
각 쓰레드마다 별도의 내부 저장소 제공
같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제 없음
public class ThreadLocalService {
private ThreadLocal<String> nameStore = new ThreadLocal<>();
public String logic(String name){
log.info("저장 name={} -> nameStore={}", name, nameStore.get());
nameStore.set(name);
sleep(1000);
log.info("조회 nameStore={}", nameStore.get());
return nameStore.get();
}
}
WAS의 쓰레드 풀에서 thread-A는 살아있다
따라서, 사용자 A요청이 끝날 때 쓰레드 로컬의 값을 ThreadLocal.remove()를 통해 제거해야 한다
[테스트] 단위테스트 vs 통합테스트 vs 인수테스트 (0) | 2024.12.11 |
---|---|
[스프링] OSIV, AOP (0) | 2024.11.27 |
[Spring] Spring IoC Container, BeanScan, 생명주기, 스코프 (0) | 2024.11.20 |
[자바] Collections API : TreeMap (0) | 2024.10.22 |
[Java] Java 메모리 구조, Reflection (0) | 2024.01.06 |