본문 바로가기

Swift

Swift - NSLock 간단히 이해하기

어느 언어든지 간에 Thread를 사용하는 프로그램을 개발할 때에는


Thread Safe하게 코드를 구성해야 할 때가 있습니다.



Swift에서도 마찬가지입니다.


Swift에는 간단히 사용할 수 있는 NSLock라는 클래스가 있습니다.



아주 간단한 예제를 통해서 사용 방법을 익혀 봅시다.



var money = 10000

DispatchQueue.global().async {
    buy()
}

DispatchQueue.global().async {
    buy()
}

func buy() {
    money = money - 1000
    print(money)
}


멀티 스레딩 예제로 아주 적합한 돈에 관련한 예제입니다.



코드를 보면 DispatchQueue.global().async를 통해서 2개의 Thread를 실행시킵니다.


그리고 buy()라는 메소드를 통해서 money라는 하나의 데이터를 변경합니다.



당연한 결과 이긴 하지만 둘다 9000이 된 결과를 볼 수 있을 겁니다.


두개의 Thread가 동시에 buy()라는 메소드를 실행시킨 탓일 겁니다.



그럼 NSLock을 사용하여 이를 원하는 결과가 나오게 해봅시다.



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)
}


NSLock이 buy()가 실행됬을때 lock.lock()로 잠구고,


defer은 buy()가 끝날때 실행이 되는데, 그 때 lock.unlock을 통해 잠금을 풉니다.



Thread 1 buy() 실행, 잠금 -> Thread 2 buy() 대기 -> Thread 1 buy() 실행 후 잠금 해제 -> Thread 2 buy() 실행, 잠금 -> Thread 2 buy() 실행 후 잠금해제



이런식으로 실행이 됩니다.



그러면 원하는 결과를 얻을 수 있습니다.



'Swift' 카테고리의 다른 글

Swift 프로토콜(protocol)과 Java 인터페이스(interface) 차이  (2) 2017.02.16
Swift dynamic  (0) 2017.02.15