공유 변수에 동시성 문제 발생시키기
실습 🧑💻
- 프로젝트 생성하기
- 동시성 문제 발생하는 코드 작성하기
- k6로 테스트하기
왜 동시성 문제가 발생할까?
공유 변수를 증가시키는 연산은 원자적(atomic)이지 않음
실제로는 다음 3단계로 수행
- 변수 읽기
- 값 증가 ( +1 )
- 값을 변수에 저장
두 개 이상의 스레드가 동시에 이 연산을 수행하면,
한 스레드의 결과가 덮어씌워지는 Lost Update 현상이 발생할 수 있음
원자적**(atomic)**이란?
- 하나의 작업 단위를 더 이상 나눌 수 없는 상태
- 전부 실행되거나 전혀 실행되지 않는(all-or-nothing) 상태를 보장
- 실행 도중 다른 스레드가 간섭할 수 없음
상세 흐름
| 흐름 |
스레드 A |
스레드 B |
변수 값 |
| 1 |
변수 읽기 |
|
0 |
| 2 |
|
변수 읽기 |
0 |
| 3 |
값 증가 (+1) |
|
0 |
| 4 |
|
값 증가 (+1) |
0 |
| 5 |
값 저장 |
|
1 |
| 6 |
|
값 저장 |
1 |
어떻게 해결할 수 있을까?
락(Lock)을 건다!
- 여러 스레드나 프로세스가 동시에 하나의 공유 자원에 접근하지 못하도록, 특정 시점에 하나만 접근 가능하게 제어하는 것