ATM 뱅킹 계정 동시성 제어 시뮬레이션

시작 잔고 1,000,000원 상태에서 100개의 스레드가 동시에 각 10,000원씩 인출을 시도하는 시나리오
기존 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 // 데이터 레이스 원천 불가
    }
}