Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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
Java 如何在executorCompletionService中使用concurrentHashMap?_Java_Multithreading_Thread Safety - Fatal编程技术网

Java 如何在executorCompletionService中使用concurrentHashMap?

Java 如何在executorCompletionService中使用concurrentHashMap?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我搜索了很多次数据库,即使我缓存了一些结果,仍然花费了很长时间 List<Map<Long, Node>> aNodeMapList = new ArrayList<>(); Map<String, List<Map<String, Object>>> cacheRingMap = new ConcurrentHashMap<>(); for (Ring startRing : startRings) {

我搜索了很多次数据库,即使我缓存了一些结果,仍然花费了很长时间

List<Map<Long, Node>> aNodeMapList = new ArrayList<>();
Map<String, List<Map<String, Object>>> cacheRingMap = new ConcurrentHashMap<>();
for (Ring startRing : startRings) {
    for (Ring endRing : endRings) {
        Map<String, Object> nodeMapResult = getNodeMapResult(startRing, endRing, cacheRingMap);
        Map<Long, Node> nodeMap = (Map<Long, Node>) nodeMapResult.get("nodeMap");
        if (nodeMap.size() > 0) {
            aNodeMapList.add(nodeMap);
        }
    }
}
当我在executorCompletionService中使用concurrentHashMap缓存结果时,这个线程安全吗

正如其名称所示,
ConcurrentHashMap
本身是线程安全的(“Concurrent”)。然而,这并不意味着使用它的代码是线程安全的

例如,如果您的代码执行以下操作:

SomeObject object = cacheRingMap.get(someKey); //get from cache
if (object == null){ //oh-oh, cache miss
    object = getObjectFromDb(someKey); //get from the db
    cacheRingMap.put(someKey, object); //put in cache for next time
}
由于在本例中,
get
put
不是自动执行的,因此执行此代码的两个线程可能会首先在缓存中查找同一密钥,然后在数据库中查找。它仍然是线程安全的,但我们执行了两次db查找,而不是一次。但这只是一个简单的例子,更复杂的缓存逻辑(例如,包括缓存失效和从缓存映射中删除的缓存逻辑)最终可能不仅是浪费,而且实际上是不正确的。这完全取决于地图的使用方式以及您需要从中获得什么保证。我建议你读这本书。看看它能保证什么,不能保证什么

我换衣服后它会跑得快吗

这取决于预先知道的参数太多。数据库将如何处理并发查询?有多少查询?单个查询的速度有多快?知道的最好方法就是实际尝试一下

作为补充说明,如果您正在寻找提高性能的方法,您可能希望尝试使用批处理查询。然后,流程将是在缓存中搜索所有需要的密钥,收集需要查找的密钥,然后在单个查询中将它们一起发送到数据库。在许多情况下,单个大型查询的运行速度要比一组较小的查询快


此外,您应该检查映射中的并发查找是否比您案例中的单线程查找快。在您的情况下,也许只并行查询本身而不是并行缓存查找可以产生更好的结果。

当两个线程对cacheRingMap执行put方法时,它仍然是线程安全的吗?我没有添加同步关键字阅读
ConcurrentHashMap
文档。它是线程安全的。
SomeObject object = cacheRingMap.get(someKey); //get from cache
if (object == null){ //oh-oh, cache miss
    object = getObjectFromDb(someKey); //get from the db
    cacheRingMap.put(someKey, object); //put in cache for next time
}