首页 > 试题广场 >

线程安全的map在JDK 1.5及其更高版本环境 有哪几种方

[不定项选择题]
线程安全的map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?
  • Map map = new HashMap()
  • Map map = new TreeMap()
  • Map map = new ConcurrentHashMap();
  • Map map = Collections.synchronizedMap(new HashMap());
推荐
答案 : C D 
1. HashMap,TreeMap 未进行同步考虑,是线程不安全的。
2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
3. Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List  list = Collections.synchronizedList(new ArrayList());
Set  set = Collections.synchronizedSet(new HashSet());

编辑于 2016-05-18 09:47:40 回复(11)
HashMap,TreeMap是线程不安全的。 HashTable 和 ConcurrentHashMap 都是线程安全的。同时Collection类还提供了synchronized()方法,使得线程安全。
发表于 2017-01-12 15:23:34 回复(3)
HashMap不是线程安全的;
Hashtable线程安全,但效率低,因为是Hashtable是使用synchronized的,所有线程竞争同一把锁;
ConcurrentHashMap不仅线程安全而且效率高,因为它包含一个segment数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术
为什么HashMap不是线程安全的?   
1、如果多个线程同时使用put方法添加元素,而且假设正好存在两个put的key发生了碰撞(根据hash值计算的bucket一样),那么根据HashMap的实现,这两个key会添加到数组的同一个位置,这样最终就会发生其中一个线程的put的数据被覆盖。
2、如果多个线程同时检测到元素个数超过数组大小* loadFactor,这样就会发生多个线程同时对Node数组进行扩容,都在重新计算元素位置以及复制数据,但是最终只有一个线程扩容后的数组会赋给table,也就是说其他线程的都会丢失,并且各自线程put的数据也丢失。
hashMap实现线程安全:

1、//Hashtable<String, String> hashtable =newHashtable<>();

2、//synchronizedMap<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());

3、//ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();



发表于 2018-08-30 20:50:55 回复(6)
这里面有关于集合框架的介绍http://blog.csdn.net/shakespeare001/article/details/51274685
发表于 2016-05-05 17:30:59 回复(3)
答案:CD
HashMap与TreeMap都是非线程安全的 
发表于 2015-01-04 13:55:25 回复(0)
我竟然没看清线程安全。。。
发表于 2017-08-08 09:36:35 回复(0)
HashMap和TreeMap都是非安全的
发表于 2016-02-10 16:23:20 回复(0)
C D,高票答案中ConcurrentHashMap的分析是JDK1.8之前的,之后的加锁并不是分段锁了,而是更细粒度的锁,只在修改map的时候对链表头(红黑树根)加锁
发表于 2016-09-06 22:05:35 回复(0)
HashMap,TreeMap 未进行同步考虑,线程不安全
发表于 2022-05-11 15:03:28 回复(0)
注意,题目说的是线程安全
发表于 2022-04-07 09:41:03 回复(0)
发表于 2022-03-03 11:06:12 回复(0)
选CD
1. HashMap,TreeMap 未进行同步考虑,是线程不安全的。
2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
3. Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List  list = Collections.synchronizedList(new ArrayList());
Set  set = Collections.synchronizedSet(new HashSet());
发表于 2020-07-14 15:48:37 回复(0)
  1. 都实现了Map接口,主要区别在于线程安全性,同步和速度
  2. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行
  3. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable
  5. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的
  6. 让HashMap同步的方法Map m = Collections.synchronizeMap(hashMap);或ConcurrentHashMap
发表于 2018-12-20 15:23:32 回复(0)
HashMap,TreeMap是线程不安全的。
HashTable 和 ConcurrentHashMap 都是线程安全的。
同时Collection类还提供了synchronized()方法,使得线程安全。

编辑于 2018-10-11 10:59:43 回复(0)
成功错过所有正确的答案
发表于 2018-09-18 15:46:59 回复(0)
HashTable是线程安全的
发表于 2015-08-01 23:35:32 回复(0)
牢记treemap是线程不安全的!
发表于 2017-09-18 23:56:41 回复(0)
 HashMap,TreeMap 未进行同步考虑,是线程不安全的。
2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
3. Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List  list = Collections.synchronizedList(new ArrayList());
Set  set = Collections.synchronizedSet(new HashSet());
发表于 2016-09-11 16:51:55 回复(0)
转:Collections类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如 List list =Collections.synchronizedList(new ArrayList());
发表于 2023-05-25 16:48:46 回复(0)
利用集合工具类接口collections  提供的synchronized方法对指定的集合封装成线程同步的集合
发表于 2022-10-19 20:17:02 回复(0)
眼瞎了
发表于 2022-09-21 10:10:59 回复(0)