(240609) Medium Daily Digest

Godomin·2024년 6월 9일

Medium-Daily-Digest

목록 보기
19/24

Mastering Synchronization in Kotlin: Best Practices for Multithreaded Programming

https://blog.stackademic.com/mastering-synchronization-in-kotlin-best-practices-for-multithreaded-programming-da8ab2fe795c

Kotlin의 동기화 테크닉

  1. synchronized Block
    특정 시점에 오직 하나의 스레드만 이 블록에 접근할 수 있다.

  2. @Synchronized Annotation
    메서드나 코드 블록에 적용 가능하며 코틀린이 암시적으로 동기화를 위한 모니터 객체를 생성한다.

  3. Atomic Operation
    코틀린은 AtomicInteger, AtomicBoolean 등의 atomic type를 지원한다.

  4. Mutex and Semaphore
    Mutex: 한 번에 하나의 lock을 획득하여 리소스에 대한 독점적 액세스를 허용하도록 보장한다. 다른 스레드는 일시 중지 된다. Race condition을 방지하고 스레드 안전을 보장하는 데 도움이 된다.
    Semaphore: 고정된 수의 스레드가 동시에 공유 리소스에 액세스하거나 특정 작업을 동시에 수행할 수 있도록 허용 개수를 유지한다.

동기화 best practice

  1. 공유 상태를 이해: 공유 리소스가 있는 부분을 식별
  2. 불변성: 생성 후 수정이 불가능하기 때문에 본질적으로 스레드로부터 안전
  3. 동기화된 블록 최소화: 과도하게 사용하면 병목 현상과 교착 상태 발생 가능, I/O나 장기 연산은 피해야 함
  4. 세분화 된 lock 사용: 전체 메서드나 블록 대신 Mutex같은 세분화 된 잠금 메커니즘을 사용하는 것이 좋음
  5. Atomic operation
  6. Thread-safe collection: ConcurrentHashMap 등
  7. 중첩된 잠금 피하기: 교착 상태가 발생할 수 있음

New Compose Navigation with safe args 🚀🔥

https://medium.com/@benmansour1992/safe-args-in-compose-navigation-6c9bded78d3d

기존에는 screen_two/{id} 와 같이 string 타입으로 route와 parameter를 관리해야 했다.
Navigation Compose 2.8.0-alpha08 버전부터 type-safe한 객체를 사용할 수 있도록 업데이트 되었다.
사용을 위해 kotlin serialization이 필요하다.

Destination 객체

import kotlinx.serialization.Serializable

object Screen {
    // Define first destination that doesn't take any arguments
    @Serializable
    object One

    // Define second destination that takes a String parameter
    @Serializable
    data class Two(val param: String)
}
@Composable
fun MainNavigation(
    navController: NavHostController
) {
    NavHost(
        navController = navController,
        startDestination = Screen.One
    ) {
        composable<Screen.One> {
            ScreenOne(
                onClickAction = {
                    navController.navigate(
                        Screen.Two(param = "Param 1")
                    )
                }
            )
        }

        composable<Screen.Two> {
            val args = it.toRoute<Screen.Two>()
            ScreenTwo(
                param = args.param,
            )
        }
    }
}

0개의 댓글