<aside> 🥕
더 이상 작은 단위로 쪼갤 수 없는, 한 번에 완전히 수행되는 연산
</aside>
다른 어떤 연산의 방해도 받지 않고 통째로 완료되거나 아예 시작되지 않거나 둘 중 하나만 보장되는 연산
동시성이 존재하는 환경에서 공유 자원의 일관성을 보장할 수 있기 때문입니다. 여러 스레드가 동시에 같은 데이터에 접근할 때, 원자성이 보장되지 않으면 데이터가 손상될 수 있습니다.
i라는 변수의 값을 1 증가시키는 연산인i++를 생각해보겠습니다.
i++ 연산은 코드 상으로는 한 줄로 보이지만, 실제로는 CPU에서 다음 세 가지 비원자적(Non-atomic) 단계로 이뤄집니다 :
i의 현재 값을 레지스터로 불러옵니다(LOAD)i에 씁니다(STORE)i++ 연산을 실행한다면?다음과 같이, 연산이 뒤섞이는 **레이스 컨디션(Race Condition)**이 발생할 수 있습니다 :
| 스레드 1 | 스레드 2 | 메모리(i) |
|---|---|---|
i 를 레지스터로 로드(값 : 5) |
5 | |
i 를 레지스터로 로드(값 : 5) |
5 | |
| 레지스터 값에 1을 더함(값 : 6) | 5 | |
| 레지스터 값에 1을 더함(값 : 6) | 5 | |
레지스터 값(6)을 i에 저장 |
6 | |
레지스터 값(6)을 i에 저장 |
6 | |
| 결과 | 6(7이 아님) |