Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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 是否必须同步线程安全的集合?_Java_Collections_Thread Safety_Hashmap_Synchronized - Fatal编程技术网

Java 是否必须同步线程安全的集合?

Java 是否必须同步线程安全的集合?,java,collections,thread-safety,hashmap,synchronized,Java,Collections,Thread Safety,Hashmap,Synchronized,我想只对单线程环境使用Collection,我正在使用一个同步的HashMap 但是,我仍然怀疑同步它是否是线程安全的。根据您的需要,请使用ConcurrentHashMap。它允许从多个线程并发修改映射,而无需阻止它们集合。synchronizedMap(map)创建一个阻塞映射,这会降低性能,但会确保一致性常用的集合类,如java.util.ArrayList,不会同步。但是,如果两个线程可能同时更改一个集合,则可以使用synchronizedCollection()方法从中生成一个同步集合

我想只对单线程环境使用
Collection
,我正在使用一个同步的
HashMap


但是,我仍然怀疑同步它是否是线程安全的。

根据您的需要,请使用
ConcurrentHashMap
。它允许从多个线程并发修改映射,而无需阻止它们<代码>集合。synchronizedMap(map)创建一个阻塞映射,这会降低性能,但会确保一致性

常用的
集合
类,如
java.util.ArrayList
,不会同步。但是,如果两个线程可能同时更改一个集合,则可以使用
synchronizedCollection()
方法从中生成一个同步集合。与只读方法类似,线程安全API允许您生成同步的集合、列表、集合或映射。例如,这就是如何从
HashMap
生成同步映射的方法:

  Map map = Collections.synchronizedMap(new HashMap());
  map.put(...

由于它是一个单线程环境,您可以安全地使用HashMap

  • 标准java哈希映射未同步
  • 如果您处于单线程环境中,则无需担心同步问题

  • 如果只使用单个线程,则不需要线程安全的集合-
    HashMap
    应该可以

    您应该非常小心地制定您的要求:

      如果你真的使用一个线程,坚持<代码> HashMap <代码>(或者考虑<代码> LinkedHashMap <代码> >
    • 如果您要共享地图,您需要确定您想要什么样的安全:
      • 如果映射在被多个线程使用之前已完全填充,而这些线程只是读取,那么
        HashMap
        仍然可以
      • 集合。synchronizedMap
        将仅同步每个单独的操作;现在还不是 在一个线程中迭代并在另一个线程中修改映射是安全的,无需同步
      • ConcurrentHashMap
        是一种更“彻底”的线程安全方法,我通常更喜欢这种方法 超过
        同步地图
        。它允许在迭代过程中进行修改,但不能保证 在迭代时可以看到这样的修改。还要注意的是,
        HashMap
        允许空值 键和值,
        ConcurrentHashMap
        没有