동시성 문제란?
카테고리: Spring
태그: 동시성 문제
인프런에 있는 김영한 님의 스프링 핵심 원리 - 고급편 강의를 듣고 정리한 내용 입니다. 😀
🌜 [스프링 핵심원리 - 고급편]강의 들으러 가기!
🔔 동시성 문제란?
@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();
}
}
}
위의 코드는 param으로 받은 name값을 nameStore에 저장하고 1초 후에 nameStore의 값을 조회하는 간단한 코드이다.
🔔 테스트
위의 코드로 아래와 같은 테스트를 진행해 보자.
@Slf4j
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(2000); // 동시성 문제 발생X
sleep(100); // 동시성 문제 발생O
threadB.start();
sleep(3000); // 메인 쓰레드 종료 대기
log.info("main exit");
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
위의 테스트의 실행결과 이다.
userB가 2번 조회 되었다.
thread-A는 userA를 저장했지만 조회해온 값은 userB가 조회 되었다.
정리하자면 다음과 같다.
- Thread-A는 userA를 nameStore에 저장했다.
- Thread-B는 userB를 nameStore에 저장했다.
- Thread-A는 userB를 nameStore에서 조회했다.
- Thread-B는 userB를 nameStore에서 조회했다.
🔔 결론
이 처럼 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제
라고 한다.
당연한 이야기지만
지역 변수
는 쓰레드마다 각각 다른 메모리 영역이 할당되므로동시성 문제
가 발생하지 않는다.
동시성 문제
가 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생), 또는 static 같은 공용필드에 접근할 때 발생한다.
동시성 문제
는 값을 읽기만 하면 발생하지 않는다. 어디선가 값을 변경하기 때문에 발생한다.
스프링의 빈 객체는 기본적으로 싱글톤이기 때문에 이러한 동시성 문제
가 발생할 수 있다.
그렇다면 이러한 동시성 문제
를 해결하기 위한 방법에는 어떤 방법이 있을까?
다음시간에 이어서 알아보자.
댓글 남기기