type
Post
status
Published
date
Feb 2, 2026
slug
synchronization-primitives
summary
Kotlin 协程提供了基于挂起 (Suspend)同步原语(Synchronization Primitives),确保在等待锁时释放底层线程资源。
tags
Kotlin
协程
category
开发日志
icon
fas fa-code
password
在协程中,传统的 Java 锁(synchronized, ReentrantLock)会阻塞 (Block) 线程,导致调度器无法利用该线程执行其他协程。
所以在协程中以下代码是反模式(Anti-Patterns)
  • synchronized(lock) { ... }
  • ReentrantLock.lock()
  • Thread.sleep()
后果: 会阻塞底层的 Worker 线程(如 Dispatchers.Default),导致线程池耗尽,严重降低系统吞吐量。必须使用 Mutexdelay() 等挂起函数替代。
针对这个问题Kotlin 提供了基于挂起 (Suspend)同步原语,确保在等待锁时释放底层线程资源。

Mutex (互斥锁)

  • 定义:协程专属的非阻塞互斥锁,替代 Java 的 ReentrantLock
  • 详解:它解决了传统锁会阻塞线程的问题。当锁被占用时,Mutex 会将当前协程挂起(Suspend),释放底层线程去执行其他任务,直到锁可用时再恢复执行。
  • 使用示例
     

    Semaphore (信号量)

    • 定义:用于控制并发访问数量,维护一组“通行证”。
    • 详解:
      • 调用 acquire() 时若许可不足,协程会挂起而非阻塞线程;
      • 调用 release() 会归还许可并唤醒等待队列中的协程。
      • 常用于实现资源限流(Rate Limiting)或连接池控制。例如,为了防止瞬间 1000 个并发请求对上游造成过大压力,可以用 Semaphore(10) 强制限制同时只有 10 个请求能到达上游。
    • 使用示例