Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 使用ConcurrentHashMap_Java_Multithreading - Fatal编程技术网

Java 使用ConcurrentHashMap

Java 使用ConcurrentHashMap,java,multithreading,Java,Multithreading,我是Java线程新手,需要从几个活动线程访问数据结构。我听说java.util.concurrent.ConcurrentHashMap是线程友好型的。我需要使用synchronized(map){} 在访问ConcurrentHashMap时,它会自己处理锁吗?它会自己处理锁,而事实上您无权访问它们(没有其他选项) 您可以在写操作的特殊情况下使用synchronized,但很少需要这样做。e、 g.如果您需要实现自己的putIfAbsent,因为创建对象的成本很高 使用syncrhonized

我是Java线程新手,需要从几个活动线程访问数据结构。我听说java.util.concurrent.ConcurrentHashMap是线程友好型的。我需要使用
synchronized(map){}

在访问ConcurrentHashMap时,它会自己处理锁吗?

它会自己处理锁,而事实上您无权访问它们(没有其他选项)

您可以在写操作的特殊情况下使用
synchronized
,但很少需要这样做。e、 g.如果您需要实现自己的
putIfAbsent
,因为创建对象的成本很高


使用syncrhonized进行读取会破坏使用并发集合的目的。

简短回答:不,您不需要使用
synchronized(map)

长答覆:

  • ConcurrentHashMap
    提供的所有操作都是线程安全的,您可以调用它们而不用担心锁定问题
  • 然而,如果您需要在代码中实现原子操作,那么仍然需要在客户端进行某种锁定

  • 不需要,但如果需要依赖内部同步,则应使用
    集合。synchronizedMap
    。从
    ConcurrentHashMap
    的javadoc:

    该类在依赖于其线程安全性而不依赖于其同步细节的程序中与哈希表完全互操作

    实际上,它不会在整个数据结构上同步,而是在它的子部分(某些存储桶)上同步。
    这意味着
    ConcurrentHashMap
    的迭代器弱一致,映射的大小可能不准确。(但另一方面,它的put和get操作仍然是一致的,吞吐量更高)

    ConcurrentHashMap
    仅适用于您不需要更多原子性的情况。例如,如果您需要获取一个值,使用它做一些事情,然后设置一个新值,所有这些都是在原子操作中完成的,如果没有外部锁定,这是无法实现的

    在所有这些情况下,没有任何东西可以取代代码中的显式锁,使用此实现而不是基本的
    HashMap

    除了concurrenthmp提供的并发特性之外,还有一个更重要的特性需要注意,那就是故障安全迭代器。使用CHMP仅仅是因为他们想在迭代时编辑put/remove的入口集。
    Collections.synchronizedMap(Map)
    是另一个。但在上述情况下,ConcurrentModificationException可能会出现

    为什么有人需要在地图上使用
    .size()
    values()
    keySet()
    是否与大小一样不准确?@dantuch No-cf javadoc中的值例如:“集合由映射支持,因此映射的更改反映在集合中,反之亦然。”此外
    putIfAbsent
    以原子方式执行,这在某些情况下非常有用。