yaz*_*yed 6 kotlin kotlin-coroutines
我正在试验 Kotlin 协程。
说我有一个可变列表:
val list = mutableListOf<String>()
Run Code Online (Sandbox Code Playgroud)
我启动了 50 个这样的协程:
runBlocking {
for (i in 1..50) {
launch(Dispatchers.IO) {
delay(1000)
list.add(i.toString())
}
}
}
list.forEach { println(it) }
Run Code Online (Sandbox Code Playgroud)
显然,尽管存在“延迟(1000)”,但操作仍需要大约一秒钟,因为它们是异步运行的
这些是不会引起问题的简单操作,但是如果我同时写入很多大字符串,某些操作会失败吗?
如果使用 appendText 函数写入本地文件,某些操作是否会失败,因为文件可能被另一个写入操作锁定?
gid*_*dds 11
这里的问题是List实现可能不是线程安全的:如果两个不同的线程尝试同时更新它,它不能保证正确的操作。
(这种问题是有害的,因为它在大多数情况下都能正常工作,但在某些时候会失败,通常是在负载过重的情况下。)
不知道有没有高性能线程安全的List实现。
一种选择是采用普通的并将其放入线程安全包装器中;只要您仅通过该包装器访问它,它就会强制执行线程安全(通过使用同步来序列化访问,迫使调用者阻塞直到他们可以轮到他们为止)。例如:
val list = java.util.Collections.synchronizedList(mutableListOf<String>())
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用一种特殊用途的线程安全List实现,例如CopyOnWriteArrayList. (或者,如果您只需要迭代而不是完全List实现,则有ConcurrentLinkedQueue.)
(事情对Maps更好;JRE 具有ConcurrentHashMap线程安全但高性能,并且大多数方法不会阻塞。)
(我不知道是否File.appendText()是线程安全的。我认为操作系统通常会在文件级别提供这种安全性,但我不知道这是否适用于此。)
| 归档时间: |
|
| 查看次数: |
4283 次 |
| 最近记录: |