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),导致线程池耗尽,严重降低系统吞吐量。必须使用 Mutex 或 delay() 等挂起函数替代。
针对这个问题Kotlin 提供了基于挂起 (Suspend) 的同步原语,确保在等待锁时释放底层线程资源。
Mutex (互斥锁)
- 定义:协程专属的非阻塞互斥锁,替代 Java 的
ReentrantLock。
- 详解:它解决了传统锁会阻塞线程的问题。当锁被占用时,Mutex 会将当前协程挂起(Suspend),释放底层线程去执行其他任务,直到锁可用时再恢复执行。
- 使用示例
Semaphore (信号量)
- 定义:用于控制并发访问数量,维护一组“通行证”。
- 详解:
- 调用
acquire()时若许可不足,协程会挂起而非阻塞线程; - 调用
release()会归还许可并唤醒等待队列中的协程。 - 常用于实现资源限流(Rate Limiting)或连接池控制。例如,为了防止瞬间 1000 个并发请求对上游造成过大压力,可以用
Semaphore(10)强制限制同时只有 10 个请求能到达上游。
- 使用示例