class Counter {
var count = 0
func increase() {
count += 1
}
}
각기 다른 곳에서 동일한 Counter 객체를 참조하여 비동기적으로 접근한다고 생각해보자.
increase()
가 비동기적으로 여러 곳에서 동작한다고 한다면,
내부의 count 프로퍼티는 dataRace
가 발생한다. 공유가 가능하고, 변경이 가능한 상태(shared mutable state)
이기 때문.
struct Counter {
var count = 0
mutating func increase() {
count += 1
}
}
그래도 DispatchQueue.global
을 이용해서 비동기적으로 호출하면 dataRace
발생.
결국 이 문제를 해결하려면 let
으로, 변경이 불가능한 상태가 되어야 한다.
다만 그건 싫음.
actor Counter {
var count: Int = 0
func increase() {
count += 1
}
}
//외부
let counter = Counter()
await counter.increase()
이런 식으로 actor 내부의 메서드가 내부의 값을 변경시킬 때,
외부에서 호출 시, 잠시동안 호출코드를 “기다리게” 만든다.