Jetpack Compose中LaunchedEffect无限循环的协程与状态变量问题
关于Compose时钟示例的两个问题解答
问题A:使用LaunchedEffect(Unit){ while (true) {...} }会生成大量协程并导致App崩溃吗?
不会,原因如下:
LaunchedEffect的执行逻辑绑定传入的key参数,这里传入的是Unit,意味着只有Clock组件首次进入Compose组合时,才会启动唯一一次协程;只要组件不被移出组合,这个协程会持续运行,不会重复创建新的协程实例。- 协程内部的
while(true)循环是在同一个协程里执行,每次循环通过delay(1000)挂起协程,不会持续占用线程资源,也不会生成新协程。 - 当
Clock组件被移出组合时,LaunchedEffect会自动取消对应的协程,不会出现协程泄漏的情况。
问题B:当多个协程尝试为val second = remember{...}这类状态变量赋值时,变量会被锁定吗?
不会加锁,但mutableStateOf创建的状态变量的value赋值操作是线程安全且原子性的:
- Compose的
MutableState底层实现已经处理了线程安全问题,多个协程同时对value赋值时,不会出现数据损坏或不一致的情况,但不会通过加锁阻塞其他协程的执行。 - 回到你的示例代码,实际上只会有一个协程对这些状态变量赋值——因为
LaunchedEffect(Unit)只会启动单个协程,所以不会出现多协程同时赋值的场景。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

