在 Dart Isolate 之间共享状态而不发疯:shared_map 登场
来源:dev.to — 2026-09-20
📋 概述
Dart 的并发模型建立在 Isolate 上:与 Java、C++ 或 Go 的线程不同,Isolate 之间不共享内存,每个都有自己的私有堆和单线程事件循环。这个「不共享」模型是很漂亮的设计,彻底消除了数据竞争、死锁、互斥锁争用和线程同步 bug——直到你真的需要在 Isolate 之间共享数据。常见场景是 Flutter 应用用 Isolate.run 在后台做大图缩放、JSON 解码、哈希计算或 ML 运算,而这些并发工作线程都需要访问同一份内存缓存(比如已解析的元数据、认证令牌)。传统上只有两个糟糕的选择,还有第三种几乎没人谈的选项。
🔑 核心要点
- Dart 的 share-nothing 模型消除了数据竞争、死锁与互斥锁争用,代价是跨 Isolate 共享数据这件事本身变得困难。
- 传统选择一:反复序列化并复制整个数据结构跨越 Isolate 边界,对大数据或高频操作会烧掉大量 CPU 并制造 GC 压力。
- 传统选择二:手搓 ReceivePort 与 SendPort 消息服务,要自己设计请求响应 DTO、请求关联 ID、响应 completer,一个简单的键值查询能写出 150 行脆弱管线。
- package:shared_map 由资深 Dart 工程师 Graciliano M. Passos 创建,零第三方依赖,pub 上 160/160 满分,完全兼容 Dart 3。
- 心智模型很简单:主 Isolate 上的实例是权威来源,调用 .sharedReference() 生成可序列化的轻量令牌,把它传过 Isolate 边界后在辅助实例上操作。
💡 金句
这个不共享的模型是很漂亮的设计——直到你真的需要在 Isolate 之间共享数据。
👍 0
👎 0
← 返回 dev.to 首页