You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Timer执行的函数是否线程安全?代码示例分析

Flutter中Timer执行的函数是否线程安全?

首先明确:Flutter里的Timer(包括周期性的Timer.periodic),其回调函数是运行在**主线程(UI线程)**的事件循环中的,并不会开启独立的后台线程。所以Timer执行的函数和UI操作触发的代码,都是在同一个线程里串行执行的,不存在多线程并发访问共享资源的场景,从多线程角度来说,Timer的回调函数本身不会有线程安全问题。

示例代码的线程安全性分析

先看给出的代码:

class AppState extends ChangeNotifier {
  List<int> collection = [];
  
  AppState() {
    Timer.periodic(
      const Duration(seconds: 1),
      (Timer t) async => await mutateCollection(),
    );
  }
  
  Future mutateCollection() async {
    collection.add(DateTime.now().millisecond);
    notifyListeners();
  }
  
  void mutateCollectionFromUI() {
    collection.add(DateTime.now().millisecond);
    notifyListeners();
  }

  void createNewCollectionFromUI() {
    collection = [];
    notifyListeners();
  }
}

这段代码不存在多线程层面的线程安全问题,原因如下:

  • Timer.periodic的回调在主线程执行,哪怕mutateCollection是异步函数,await之后的代码(包括修改collection和调用notifyListeners)也会回到主线程的事件循环中执行。
  • UI触发的mutateCollectionFromUI、createNewCollectionFromUI方法同样在主线程执行。
  • 所有对collection的读写操作都是串行执行的,不会出现多个线程同时修改或读取collection的情况,也就不会引发多线程下的竞态条件。

需要注意的是:虽然没有多线程问题,但可能存在事件队列调度的时序问题——比如Timer回调和UI操作的回调会按事件队列的先后顺序执行,不过这属于业务逻辑的时序范畴,和线程安全无关。

内容的提问来源于stack exchange,提问作者Maciej Pszczolinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:30:49