gpt4 book ai didi

使用 ConcurrentHashMap 进行 Kotlin 并发,同时在不使用锁的情况下检索和删除

转载 作者:行者123 更新时间:2023-12-04 13:13:23 26 4
gpt4 key购买 nike

我想了解 ConcurrentHashMap看看我是否可以在不添加任何锁的情况下利用它。我有一个 ConcurrentHashMap一天开始时的书籍数量。

class Z {
val books: ConcurrentHashMap<String, Int> = ConcurrentHashMap()

fun addBook(book: String, numberOfBooks: Int) {
books[book] = numberOfBooks
}

fun doSomething(book: String) {
val numberOfBooks = books.remove(book)
}
}
以上将是线程安全的。但是现在,如果我需要添加验证以确保在初始化期间不会两次添加该书,我需要添加 synchronized阻止只是为了确保我没有添加如下内容。
class Z {
val books: ConcurrentHashMap<String, Int> = ConcurrentHashMap()
val lock = Any()
fun addBook(book: String, numberOfBooks: Int) {
synchronized(lock) {
val existingBook = books[book]
if(existingBook!=null)
println("Book exists, BEWARE!!")
books[book] = numberOfBooks
}
}

fun doSomething(book: String) {
var numberOfBooks : Int?
synchronized(lock)
numberOfBooks=books.remove(book)
}
}
有没有更好的方法让我做到这一点。我讨厌添加 synchronized块只是为了在那里放入一个日志语句。

最佳答案

你很幸运:Map接口(interface)有几个方法可以帮助原子地做这种事情,所以在 ConcurrentHashMap 中是线程安全的。 .
在这种情况下,您甚至不需要任何奇特的东西,只需显式调用 put()方法,因为它返回前一个值(如果没有,则返回 null)。
所以你可以简单地调整你的第一个例子:

fun addBook(book: String, numberOfBooks: Int) {
val existingNumber = books.put(book, numberOfBooks)
if (existingNumber != null)
println("Book exists, BEWARE!!")
}
...无需任何同步即可完成您想要的操作。 (你失去了 Kotlin 的数组访问语法糖,但这在这里显然被抵消了。)
其他可以原子地做复杂事情的方法是 compute() , merge() , putIfAbsent() , replace() , 还有很多;值得一看整个类(class),以便您可以识别它们有用的情况。如您所知,同步会带来严重的性能损失,因此如果您能在不牺牲安全性的情况下避免它,那将是一个巨大的胜利。

关于使用 ConcurrentHashMap 进行 Kotlin 并发,同时在不使用锁的情况下检索和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62721458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com