Kotlin/포스팅

코틀린 동시성

짜집퍼박사(짜박) 2024. 1. 7. 12:15

코틀린은 기본적으로 JVM 위에서 동작하며, Java의 동시성 기능을 상당 부분 그대로 활용합니다. 따라서 코틀린에서의 동시성은 Java의 동시성 프로그래밍 모델과 유사한 개념과 기술을 사용합니다.

 

1. 스레드 (Threads)

코틀린에서 스레드는 Java와 동일한 방식으로 사용됩니다. Thread 클래스나 Runnable 인터페이스를 구현하거나, 람다 함수를 사용하여 스레드를 생성할 수 있습니다.

import kotlin.concurrent.thread

fun main() {
    // 스레드 생성 방법 1
    val thread1 = Thread {
        println("Thread 1 is running.")
    }

    // 스레드 생성 방법 2 (코틀린 확장 함수 사용)
    val thread2 = thread {
        println("Thread 2 is running.")
    }

    thread1.start()
    thread2.start()
    
    // 메인 스레드와 생성한 스레드들이 병행 실행됨
}

 

2. 코루틴 (Coroutines)

코틀린은 가볍고 효율적인 비동기 프로그래밍을 위해 코루틴을 제공합니다. 코루틴은 스레드와 달리 매우 가볍게 생성되며, 쓰레드를 블록하지 않고 비동기적인 코드를 실행할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    // GlobalScope에서 코루틴 실행
    GlobalScope.launch {
        delay(1000L)
        println("Coroutine is running.")
    }

    println("Main thread is not blocked.")
    
    // 메인 스레드와 코루틴이 병행 실행됨
    runBlocking {
        delay(2000L)
    }
}

 

3. 뮤텍스 (Mutex) 및 Locks

여러 스레드나 코루틴에서 공유되는 자원에 대한 동기화를 위해 뮤텍스나 락을 사용할 수 있습니다.

import java.util.concurrent.locks.ReentrantLock

val mutex = ReentrantLock()

fun main() {
    thread {
        mutex.withLock {
            // 공유 자원에 대한 안전한 작업
            println("Thread 1 is accessing the shared resource.")
        }
    }

    thread {
        mutex.withLock {
            // 공유 자원에 대한 안전한 작업
            println("Thread 2 is accessing the shared resource.")
        }
    }
}

 

4. 액터 (Actor)

코틀린에서는 Actor를 사용하여 간단한 메시지 패싱을 통해 동시성을 다룰 수 있습니다. 액터는 상태를 가지며, 메시지를 받아 처리하는 역할을 합니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.actor

sealed class Message
data class Greet(val name: String) : Message()

fun CoroutineScope.createActor() = actor<Message> {
    for (msg in channel) {
        when (msg) {
            is Greet -> println("Hello, ${msg.name}!")
        }
    }
}

fun main() = runBlocking {
    val actor = createActor()

    actor.send(Greet("Alice"))
    actor.send(Greet("Bob"))

    delay(1000L)
    actor.close()
}

위의 예제에서 createActor 함수를 통해 액터를 생성하고, send 함수를 통해 메시지를 보내 처리할 수 있습니다.

코틀린은 다양한 수준에서 동시성을 다룰 수 있게 해주며, 이는 기존의 자바 동시성 모델을 활용하면서도 코루틴과 같은 새로운 기능을 도입하여 효율적인 비동기 프로그래밍을 가능케 합니다.

 

With ChatGPT

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

코틀린 코루틴  (0) 2024.01.07
코틀린 쓰레드  (0) 2024.01.07
코틀린 인라인 함수  (0) 2024.01.07
코틀린 예외 선언  (0) 2024.01.07
코틀린 오버로딩한 메서드 생성  (0) 2024.01.07