Flutter中如何实现异步操作加锁
在Flutter开发中,遇到需要控制异步操作执行顺序的场景。比如多个网络请求需要按特定顺序执行,或者防止并发修改共享数据导致冲突。请问该如何正确实现异步操作的加锁机制?是否有类似Dart的Mutex或Semaphore的解决方案?目前尝试使用Completer和Future链式调用,但感觉不够直观,想了解更规范的实现方式。
2 回复
在Flutter中,可以通过以下方式实现异步操作的加锁:
1. 使用 synchronized 包
首先添加依赖:
dependencies:
synchronized: ^3.0.0
使用示例:
import 'package:synchronized/synchronized.dart';
final _lock = Lock();
Future<void> criticalSection() async {
await _lock.synchronized(() async {
// 这里是需要加锁的异步代码
await someAsyncOperation();
// 同一时间只有一个异步操作能执行到这里
});
}
2. 使用 Mutex(推荐用于复杂场景)
import 'package:async/async.dart';
final _mutex = Mutex();
Future<void> criticalSection() async {
await _mutex.protect(() async {
// 需要加锁的异步操作
await someAsyncOperation();
});
}
3. 使用 Completer 实现简单锁
Completer<void>? _lockCompleter;
Future<void> criticalSection() async {
while (_lockCompleter != null) {
await _lockCompleter!.future;
}
_lockCompleter = Completer();
try {
await someAsyncOperation();
} finally {
_lockCompleter!.complete();
_lockCompleter = null;
}
}
使用场景建议
- 简单场景:使用
synchronized包 - 复杂并发控制:使用
Mutex - 避免死锁:确保锁在 finally 块中释放
- 性能考虑:尽量减少锁的持有时间
这样可以确保在异步操作中,同一时间只有一个任务能访问共享资源。


