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