Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Thymeleaf
- db
- java
- 백준
- Exception
- Proxy
- pointcut
- Android
- Greedy
- AOP
- QueryDSL
- http
- spring
- 김영한
- springdatajpa
- JPQL
- Servlet
- 스프링 핵심 원리
- kotlin
- transaction
- 스프링
- SpringBoot
- Spring Boot
- jpa
- 스프링 핵심 기능
- 자바
- 알고리즘
- 그리디
- JDBC
- 인프런
Archives
- Today
- Total
개발자되기 프로젝트
ThreadLocal - 예제 본문
1. ThreadLocal 사용법
- 값 저장: ThreadLocal.set(xxx)
- 값 조회: ThreadLocal.get()
- 값 제거: ThreadLocal.remove()
- 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면
- ThreadLocal.remove() 를 호출해서 쓰레드 로컬에 저장된 값을 제거해주어야 한다.
2. ThreadLocalService
@Slf4j
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();
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3. Test
@Slf4j
public class ThreadLocalServiceTest {
private ThreadLocalService service = new ThreadLocalService();
@Test
void field(){
log.info("main start");
//Ruunable 인터페이스의 run() 구현.
//Thread는 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하거나,
//Runnable 인터페이스 구현 후 Thread에 주입하는 방식으로 사용 가능.
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(2000); //동시성 문제 발생 안하는 조건.
sleep(100); //동시성 문제 발생하는 조건.
threadB.start();
sleep(2000); //메인 Thread 종료 대기
log.info("main exit");
}
private void sleep(int millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4. 결과
- 각 thread마다 별도 저장소가 있기 때문에 처음 저장 시 nameStore = null.
- 동시성 문제 발생하는 조건으로 실행했지만, threadLocal 을 사용하여 동시성 문제 해결함.
[main] - main start
[thread-A] - 저장 name=userA --> nameStore=null
[thread-B] - 저장 name=userB --> nameStore=null
[thread-A] - 조회 nameStore=userA
[thread-B] - 조회 nameStore=userB
[main] - main exit
5. GitHub : 21112 ThreadLocal
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
ThreadLocal - 적용 (0) | 2021.11.22 |
---|---|
ThreadLocal - 개발 (0) | 2021.11.22 |
Thread Local - 소개 (0) | 2021.11.22 |
동시성 문제 - 예제 코드 (0) | 2021.11.22 |
필드 동기화 - 동시성 문제 (0) | 2021.11.20 |
Comments