当多个 Future/Timer 同时完成时是否存在竞争条件

Is there race condition when multiple Future/Timer complete simultaneously

如果多个 Timer/Future 在 Dart 中同时完成,是否会出现竞争条件?例如,在以下代码中访问 Timer complete handler 中的 testtest 结构时是否存在竞争条件?

import 'dart:async';

void main() {
  Map<String, int> test = {};
  List<int> test2 = [];

  Timer t1 = Timer(Duration(seconds: 1), () {
    test['a'] = 45;
    test2.add(1);
  });

  Timer t2 = Timer(Duration(seconds: 1), () {
    test['b'] = 67;
    test2.add(2);
  });

  Timer t3 = Timer(Duration(seconds: 2), () {
    print(test);
    print(test2);
  });
}

或者 Timer/Future 完成由主线程同步处理?两个回调里面的代码可以交织吗?

每个 Dart isolate 在单个线程中执行代码。异步代码 运行ning 在单个 Dart isolate 中可以 运行 concurrently 但不能 parallel.

一般来说,如果回调本身做的是异步工作,那么它们是可以交错的。任何 await(相当于任何 Future.then() 回调)是执行 returns 事件循环的点,中断您的异步函数。

在您的特定示例中,您的回调是完全同步的,不能被中断。您的 Timers 可能会按定义的顺序触发,因为事件已添加到 FIFO 队列中。然而,这似乎很脆弱,我认为依赖回调排序不是一个好主意。

另见:.