Kotlin/포스팅

코틀린 동기화와 락

짜집퍼박사(짜박) 2024. 1. 10. 19:47

동기화와 락은 다중 스레드 환경에서 공유된 자원에 대한 안전한 접근을 보장하기 위한 기술입니다. 여러 스레드가 동시에 접근할 때 발생할 수 있는 경쟁 조건과 데이터 불일치 문제를 해결하기 위해 사용됩니다. 코틀린에서는 동기화와 락을 사용하여 스레드 간의 안전한 동시 접근을 보장할 수 있습니다.

 

1. 동기화 (Synchronization)

동기화는 여러 스레드가 동시에 공유된 자원에 접근하는 것을 제어하여 안전한 실행을 보장하는 메커니즘입니다. 코틀린에서는 synchronized 키워드를 통해 메소드 또는 블록을 동기화할 수 있습니다.

 

메소드 동기화

class Counter {
    private var count = 0

    @Synchronized
    fun increment() {
        count++
    }

    @Synchronized
    fun getCount(): Int {
        return count
    }
}

블록 동기화

class SharedResource {
    private val lock = Any()
    private var data: String = "Initial Data"

    fun updateData(newData: String) {
        synchronized(lock) {
            // 동기화된 블록
            data = newData
        }
    }

    fun readData(): String {
        synchronized(lock) {
            // 동기화된 블록
            return data
        }
    }
}

 

2. 락 (Lock)

코틀린에서는 java.util.concurrent.locks 패키지의 ReentrantLock 클래스를 사용하여 명시적인 락을 구현할 수 있습니다.

import java.util.concurrent.locks.ReentrantLock

class SharedResource {
    private val lock = ReentrantLock()
    private var data: String = "Initial Data"

    fun updateData(newData: String) {
        lock.lock()
        try {
            // 락 획득 후 작업 수행
            data = newData
        } finally {
            lock.unlock()
        }
    }

    fun readData(): String {
        lock.lock()
        try {
            // 락 획득 후 작업 수행
            return data
        } finally {
            lock.unlock()
        }
    }
}

 

3. 코틀린에서의 동기화와 락 선택 기준

동기화

- 간단한 상황에서 사용하기 편리하다.
- 메소드나 블록 단위로 적용되어 코드의 가독성이 좋다.
- 내재된 잠금 매커니즘을 사용하여 JVM에서 성능이 일반적으로 향상된다.
- @Synchronized 어노테이션을 통해 메소드나 블록을 간편하게 동기화할 수 있다.

 

- 좀 더 정교한 상황에서 사용하기 적합하다.
- 명시적으로 락을 획득하고 해제하기 때문에 더 세밀한 제어가 가능하다.
- ReentrantLock 클래스는 락을 더 유연하게 활용할 수 있게 해준다.
- 락의 획득과 해제를 명시적으로 관리하므로, 예외가 발생해도 락이 해제되도록 finally 블록에서 unlock() 메소드를 호출해주어야 한다.

 

동기화와 락은 멀티스레드 환경에서 데이터 일관성과 안정성을 유지하기 위한 중요한 기술입니다. 선택은 상황에 따라 다르며, 코드의 복잡성과 유지보수 측면에서 적절한 방법을 선택하는 것이 중요합니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 코테스트 명세  (0) 2024.01.10
코틀린 테스팅  (0) 2024.01.10
코틀린 자바 동시성 사용  (0) 2024.01.10
코틀린 액터  (0) 2024.01.10
코틀린 티커  (0) 2024.01.10