Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin与ConcurrentHashMap并发,检索和删除时不使用锁_Kotlin_Concurrency_Java.util.concurrent_Concurrenthashmap - Fatal编程技术网

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!!")
}