【发布时间】:2020-09-01 19:21:10
【问题描述】:
我一直在尝试 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")
}
}
}
}
myList 是有问题的公共资源。
第一个线程是一个简单的读取操作,我打算将使用的资源保持在读取模式。第二个是另一个请求锁以修改公共资源的线程。
虽然第一个线程不包含任何同步,但我希望它能够在内部处理这个问题,以便当像 map 或 forEach 这样的函数在资源上运行时,另一个线程不应该能够锁定否则被迭代的元素可能会在 map/forEach 正在进行时发生变化(即使该操作可能会暂停一段时间,而另一个线程对其进行锁定)。
我看到的输出显示两个线程并行执行。他们都分别打印列表中的第一个元素和星星。但是在第二个线程中,即使正在打印星星,myList[0] 也永远不会设置为 9999,因为第一个线程继续打印 1。
【问题讨论】:
-
它不会“在内部处理这个”。第一个线程根本没有保护任何东西。
-
你需要通过happens-before来了解和应用并发推理。 Java 没有提供开箱即用的“最终一致性”,您似乎暗示了这一点。没有happens-before,就没有一致性。
标签: java kotlin synchronization kotlin-coroutines kotlin-android-extensions