작업 중 data race를 방지하기 위해 어떻게 처리해야할지 고민 중 Actor의 존재를 알게되어 학습하게 되었다.
변경이 가능한 상태를 고립시켜 보호하게된다.
하나의 작업만 mutable state가 변경이 가능하도록 허용한다.비동기로 수행한다 (await를 사용하며 두번째로 호출된 작업은 기다린 후 진행)<aside> ❓
data race: 두개이상의 각 스레드가 동시에 동일한 데이터에 접근 하고 해당 접근 중 하나이상이 write일 때 발생하는 충돌
</aside>
<aside> ❓
shared mutable state: 공유 및 변경이 가능한 상태, 다시 말해 var 변수와같이 여러곳에서 접근이 가능하며 변경이 가능한 것을 말한다.
</aside>
func someFunction() async {
let counter = Counter()
await counter.increment() // actor의 함수인 increment 사용 시 await 사용
}
actor-isolated하기에 self를 통해서만 접근이 가능하며 외부에서
await 키워드 없이 프로퍼티에 접근이 불가write하려고 할 때 발생되는 사유로 let은 write가 불가하여 접근 허용)<aside> ❓
actor-isolated: actor에서 동시에 하나만의 스레드만 접근이 가능하도록 보장하는 방식
</aside>
actor Sample {
var someVar: Int = 0
let someLet: Int = 0
}
func someFunction() {
let sample = Sample()
Task {
await sample.someVar // var의 경우 await로 접근
}
sample.someLet // let의 경우 write가 불가하므로 await없이 접근 가능
}
let으로 선언된 프로퍼티는 접근할 경우 바로 접근이 가능하였으나
만약 해당 Actor가 외부 모듈이라면 접근 시 let으로 선언되어도 await를 통해 접근이 가능
왜? 잘 만들어진 특정 Actor 모듈의 프로퍼티가 let으로 선언되었기에
모듈을 사용하는 내부에서 await 키워드 없이 코드를 작성해서 사용 하다가 의존하고 있던 모듈의 프로퍼티가 let → var로 업데이트 된경우
사용부에서 전부 해당 모듈의 접근 방식을 await로 변경해야되는 불참사가 발생하므로 미리 let, var 무관하게 await로만 접근이 가능하도록 제한