Kotlin与ConcurrentHashMap并发,检索和删除时不使用锁
我试图理解Kotlin与ConcurrentHashMap并发,检索和删除时不使用锁,kotlin,concurrency,java.util.concurrent,concurrenthashmap,Kotlin,Concurrency,Java.util.concurrent,Concurrenthashmap,我试图理解ConcurrentHashMap,看看我是否可以在不添加任何锁的情况下利用它。我有一个ConcurrentHashMap,在一天的开始有很多书 class Z { val books: ConcurrentHashMap<String, Int> = ConcurrentHashMap() fun addBook(book: String, numberOfBooks: Int) { books[book] = numberOfB
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
块只是为了在其中放入一个log语句。你很幸运:该接口有几种方法可以帮助原子地完成这类事情,因此在中是线程安全的
在本例中,您甚至不需要任何外来的东西,只需要显式地调用该方法,因为它返回以前的值(如果没有值,则返回null
)
因此,您可以简单地调整第一个示例:
fun addBook(book: String, numberOfBooks: Int) {
val existingNumber = books.put(book, numberOfBooks)
if (existingNumber != null)
println("Book exists, BEWARE!!")
}
…无需任何同步即可实现您想要的功能。(您将失去Kotlin的数组访问语法糖,但这显然比这更重要。)
其他可以原子化完成复杂事情的方法有、、等等;值得在课堂上看一看,这样你就可以识别出它们有用的情况。正如你清楚地知道的,同步会带来巨大的性能损失,因此如果你能在不牺牲安全的情况下避免同步,这将是一个巨大的胜利
fun addBook(book: String, numberOfBooks: Int) {
val existingNumber = books.put(book, numberOfBooks)
if (existingNumber != null)
println("Book exists, BEWARE!!")
}