Flutter中如何实现异步操作加锁

在Flutter开发中,遇到需要控制异步操作执行顺序的场景。比如多个网络请求需要按特定顺序执行,或者防止并发修改共享数据导致冲突。请问该如何正确实现异步操作的加锁机制?是否有类似Dart的Mutex或Semaphore的解决方案?目前尝试使用Completer和Future链式调用,但感觉不够直观,想了解更规范的实现方式。

2 回复

在Flutter中,可以使用Mutex类(来自synchronized包)或Lock类(来自async包)实现异步操作加锁。示例代码:

import 'package:synchronized/synchronized.dart';

final _lock = Lock();

Future<void> someAsyncMethod() async {
  await _lock.synchronized(() async {
    // 需要加锁的异步代码
  });
}

这样可以确保同一时间只有一个异步操作执行。

更多关于Flutter中如何实现异步操作加锁的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在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 块中释放
  • 性能考虑:尽量减少锁的持有时间

这样可以确保在异步操作中,同一时间只有一个任务能访问共享资源。

回到顶部