비동기로 동일 함수 실행
비동기로 같은 함수를 실행하게 되면 동시에 실행해서 같은 결과 값을 내게 됩니다.
import Foundation
var money = 10000
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
money = money - 1000
print(money)
}
9000
9000
sleep으로 동시 호출 방지
하나의 스레드가 실행될때 잠시 멈추게 하여 실행 간격에 차이를 둘 수도 있습니다.
var money = 10000
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
sleep(1)
buy()
}
func buy() {
money = money - 1000
print(money)
}
9000
8000
lock으로 동시 호출 방지
만약 실행 간격에 차이를 두는것이 아니라 '하나의 스레드가 함수를 사용 중일때, 다른 스레드에서 접근을 못하게 하려면?'
var money = 10000
let lock = NSLock()
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
lock.lock(); defer {lock.unlock()}
money = money - 1000
print(money)
}
9000
8000
이렇듯 NSLock()으로 lock을 걸면 시간 간격 차이를 두는 것과 같은 출력값이 나오게 됩니다.
순서는 이렇습니다.
Thread 1 buy() 실행, lock() -> 다른 스레드에서 접근 못함 -> Thread 2 buy() 대기 -> Thread 1 buy() 실행 후 unlock() -> 다른 스레드에서 접근 가능 -> Thread 2 buy() 실행, lock() -> 다른 스레드에서 접근 못함 -> Thread 2 buy() 실행 후 unlock()
다른 스레드 사용 방지
unlock으로 잠금해제를 하지 않게 된다면? 다른 스레드에서 접근을 하지 못한채로 끝나게 되겠죠.
var money = 10000
let lock = NSLock()
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
lock.lock()
money = money - 1000
print(money)
}
9000
'iOS > Swift' 카테고리의 다른 글
DispatchQueue의 의존성 (0) | 2021.09.05 |
---|---|
DispatchQueue 특징 (0) | 2021.09.05 |
12.2.2. 영화관 정보 API (0) | 2021.09.02 |
12.3. 영화관 목록 화면 구현하기 (0) | 2021.09.02 |
이미지 비동기 처리하기 (0) | 2021.08.14 |