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
相关产品推荐
相关产品推荐

