728x90
Test에서도 롬복을 사용하기 위해 Build.gradle에 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//테스트에서 lombok 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
FieldServie 작성 (학습 테스트)
@Slf4j
public class FieldService {
private String nameStore;
public String logic(String name){
log.info("저장 name={} -> nameStore={}", name, nameStore);
nameStore = name;
sleep(1000);
log.info("조회 nameStore={}",nameStore);
return nameStore;
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
Test 코드
@Slf4j
public class FieldServiceTest {
private FieldService fieldService = new FieldService();
@Test
public 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(2000); //동시성 문제 발생 X
sleep(100);//동시성 문제 발생
threadB.start();
sleep(3000);//메인 쓰레드 종료 대기
log.info("main exit");
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- sleep 2000 일 경우 동시성 문제 발생 X


- sleep 100 일 경우 동시성 문제 발생


- 동시성 문제
- 결과적으로 Thread-A 입장에서는 저장한 데이터와 조회한 데이터가 다른 문제가 발생한다.
- 이처럼 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라 한다.
- 이런 동시성 문제는 여러 스레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 적은 상황에서는 확률상 잘 나타나지 않고, 트래픽이 점점 많아질 수 록 자주 발생한다.
- 특히 스프링 빈 처럼 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 한다.
- 참고
- 이런 동시성 문제는 지역 변수에서는 발생하지 않는다.
- 지역 변수는 쓰레드마다 각각 다른 메모리 영역이 할당된다.
- 동시성 문제가 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생), 또는 static 같은 공용 필드에 접근할 때 발생한다.
- 동시성 문제는 값을 읽기만 하면 발생하지 않는다. 어디선가 값을 변경하기 때문에 발생한다
728x90
'스프링 핵심 원리(고급편)' 카테고리의 다른 글
| Ch02. 쓰레드 로컬(ThreadLocal) - 쓰레드 로컬 동기화 (0) | 2022.04.08 |
|---|---|
| Ch02. 쓰레드 로컬(ThreadLocal) - ThreadLocal (0) | 2022.04.08 |
| Ch02. 쓰레드 로컬(ThreadLocal) - 필드 동기화 (0) | 2022.04.08 |
| Ch01. 예제 만들기 - 로그 추적기(3) (0) | 2022.04.07 |
| Ch01. 예제 만들기 - 로그 추적기(2) (0) | 2022.04.07 |