小编BRG*_*BRG的帖子

Kotlin 中的线程同步是如何工作的?

我一直在尝试 Kotlin 同步,但从文档中我不明白锁定机制如何在公共资源上的线程同步上工作,因此尝试编写这段代码,这使我的理解进一步复杂化。

fun main() {
    val myList = mutableListOf(1)

    thread {
        myList.forEach {
            while (true) {
                println("T1 : $it")
            }
        }
    }

    thread {
        synchronized(myList) {
            while (true) {
                myList[0] = 9999
                println("**********\n**********\n**********\n")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

myList是所讨论的公共资源。

第一个线程是一个简单的读取操作,我打算将资源保持在读取模式下。第二个是另一个线程,它请求锁定以修改公共资源。

尽管第一个线程不包含任何同步,但我希望它能够在内部处理此问题,以便在某个函数(例如map或 )forEach正在对资源进行操作时,另一个线程不应该能够锁定它,否则正在迭代的元素可能会发生变化当map/forEach正在进行时(即使该操作可能会暂停一段时间,而另一个线程对其具有锁定)。

我看到的输出显示两个线程正在并行执行。它们都分别打印列表中的第一个元素和星星。但在第二个线程中,即使正在打印星星,myList[0]也永远不会设置为 9999,因为第一个线程继续打印 1。

java synchronization kotlin kotlin-android-extensions kotlin-coroutines

5
推荐指数
2
解决办法
4816
查看次数