"同步"正确的方法是什么?使用Mutex改变共享状态的函数?在使用launch()
开始的协程中使用Mutex或async()
按预期工作,但如果我使用runBlocking()
启动协程,则该线程看起来像被阻塞(锁定)很长一段时间。问题是该函数可能是从多个线程调用的,我无法用线程限制来解决这个问题。在这种情况下,使用Mutex的正确方法是什么?
答案 0 :(得分:1)
正确的方法是设计您的软件,以避免使用Mutex
和其他形式的共享可变状态。如果您有一些需要共享的资源或数据结构,您可以始终将此数据结构封装在单独的协程中,并在需要对此数据结构执行任何操作时与此协程进行通信。此设计模式称为 actor 。演员是一对协程和一个频道,它从中读取传入的消息。
此方法的优点是您可以与actor异步通信。如果您向演员发送消息并且不等待响应,那么您可以继续工作而无需等待演员完成处理您的消息。
您可以在the guide to kotlinx.coroutines中阅读更多有关演员的内容。