기존 GCD (비동기 병렬 처리)
공유 계정 잔고에 동시 인출 처리
락(Lock) 없이 100개의 ATM 트랜잭션이 메모리 장부의 동일 잔고 상태를 동시에 수정한다.
계좌 현재 잔고 (시작: 1,000,000원)
1,000,000원
요청된 총 인출 시도: 100회 (총 1,000,000원)
정상 처리되어야 할 최종 잔고: 0원
> ATM 네트워크 가동 준비 완료.
💥 데이터 레이스로 인한 계정 장부 파괴!
스레드들이 이전 잔고 값을 동시에 읽고 덮어쓰면서 연산 충돌이 발생했습니다. 인출은 정상 접수되었다고 뜨지만, 실제 잔고 장부는 마이너스가 되거나 돈이 증발하는 치명적인 오염 상태로 끝납니다.
Swift 6 (동시성 보장 권역)
컴파일 타임 안전 보장 및 실행 결과
위험한 동시 수정 코드는 컴파일러가 차단하고, Actor로 수정한 안전한 뱅킹 연산의 흐름을 확인한다.
계좌 현재 잔고 (시작: 1,000,000원)
1,000,000원
🛡️ 빌드가 차단되어 비안전 코드가 실행되지 않음
컴파일러 빌드 상태: 대기 중
트랜잭션 안전 보장 상태: -
> 원본 뱅킹 코드를 검사하거나 수정한 Actor 모델을 구동할 수 있다.
💡 데이터 레이스 해결책: Actor 계좌 격리
은행 계좌 인스턴스를 `actor`로 선언하여, 전 세계 ATM에서 들어오는 인출 요청을 큐(Queue)를 통해 한 번에 하나씩 안전하게 상호 배제 처리한다.
actor BankAccount {
private var balance = 1000000
func withdraw(_ amount: Int) {
balance -= amount // 데이터 레이스 원천 불가
}
}