---
title: "NSLock"
description: "NSLock으로 공유 데이터에 대한 동시 접근을 제어하는 방법. Thread-Safe의 의미와 lock·unlock 사용 예제를 다룹니다."
canonical: https://blog.skyline23.com/29
language: ko
published: 2022-05-25T10:37:13+09:00
modified: 2022-05-25T13:45:26+09:00
---

# NSLock

![](/blog-covers/thread-lock-1536.webp)

## 0\. 개발자 문서 확인

먼저 알아보기 전에 NSLock에 관한 설명을 애플의 개발자 문서에서 먼저 찾아보았다.

[https://developer.apple.com/documentation/foundation/nslock](https://developer.apple.com/documentation/foundation/nslock)

**An object that coordinates the operation of multiple threads of execution within the same application.**

**“동일한 어플리케이션 내에서 여러 스레드를 조정하는 객체” 라고 나와 있었다.**

## 1\. Thread-Safe를 지키는 방법

-   Re-entrancy
    -   어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드에서 함수가 호출되더라도 올바르게 주어져야함
-   Thread-local storage
    -   공유 자원을 줄여 각 스레드에서만 접근 가능한 저장소들을 사용해 동시 접근을 막음
-   Mutual exclusion
    -   공유 자원을 꼭 사용해야 할 경우 semophore등의 lock으로 통제하여 다른 스레드가 접근하지 못하게 함. 임계 영역 안에서 한가지 스레드만 접근
-   Atomic operations
    -   공유 자원에 접근할 때 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함.
    -   접근 순서를 의도적 또는 비 의도적으로 직렬화하여 의도치 않는 결과를 피하는 연산 방식.NSLock 객체를 사용하여 애플리케이션의 글로벌 데이터에 대한 액세스를 중재하거나 중요한 코드 섹션을 보호하여 원자적으로 실행할 수 있습니다.

NSLock을 사용하면 Thread-Safe하게 만드는 방법 중 하나인 atomic하게 실행하는 조건을 충족시킬 수 있다.

* * *

#### **주의**

**잠금을 한 같은 스레드에서 잠금을 해제해야함. 다른 스레드에서 잠금을 해제할 경우 원하는 결과가 나오지 않을 수 있음.**

**같은 메서드에서 잠금 메서드를 두번 호출할 경우 스레드가 영구적으로 잠기게 됨.**

## 2\. 예시 코드

```swift
import Foundation

class Number {
    private let lock = NSLock()
    var num = 1000

    func calculate() {
        self.lock.lock()
        defer { self.lock.unlock() }

        self.num -= 10
        print(self.num)
    }
}

let class1 = Number()

DispatchQueue.global().async {
    class1.calculate()
}

DispatchQueue.global().async {
    class1.calculate()
}
```

calculate 메서드에 접근할 때 lock을 한후 calculate가 끝나기 직전 lock을 풀어주는 코드이다.

Thread 1에서 calcuate 메서드 실행과 잠금 → Thread 2에서 calcuate 메서드 실행 대기 → Thread 1에서 calculate 실행 후 잠금 해제 → Thread 2에서 calcuate 메서드 실행과 잠금 → Thread 2에서 calculate 실행 후 잠금 해제

이렇게 직렬화하여 순차적으로 계산하게 된다면 의도치 않은 결과가 나오는 것을 피할 수 있다.
