A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如何处理在多线程环境下hashmap的线程不安全?

3 个回复

正序浏览
java.util包中Collections类提供的操作集合的方法,你传入一个集合,就会返回一个安全的集合
synchronizedCollection(Collection<T> c)  返回安全的Collection
synchronizedList(List<T> list)     返回安全的List
synchronizedMap(Map<K,V> m)    返回安全的Map
synchronizedSet(Set<T> s)     返回安全的Set
synchronizedSortedMap(SortedMap<K,V> m)    返回安全的SortedMap
synchronizedSortedSet(SortedSet<T> s)
回复 使用道具 举报
HashMap 是Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map 接口,主要
区别在于HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap 允许将null 作为一个entry 的key 或者value,而Hashtable 不允许。
HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey。因为contains
方法容易让人引起误解。
Hashtable 继承自Dictionary 类,而HashMap 是Java1.2 引进的Map interface 的一个实现。
最大的不同是,Hashtable 的方法是Synchronize 的,而HashMap 不是,在多个线程访问
Hashtable 时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable 和HashMap 采用的hash/rehash 算法都大概一样,所以性能不会有很大的差异。
HashMap是线程不安全的,你可以使用集合的辅助工具类Collections使其安全,或者 自己手动加
上synchronization实现同步
回复 使用道具 举报
Collections集合工具类中貌似有个方法,
synchronizedMap
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)返回由指定映射支持的同步(线程安全的)映射。为了保证按顺序访问,必须通过返回的映射完成所有对底层实现映射的访问。
在返回映射的任意 collection 视图上进行迭代时,用户必须手工在返回的映射上进行同步:

  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized(m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
不遵从此建议将导致无法确定的行为。
如果指定映射是可序列化的,则返回的映射也将是可序列化的。


参数:
m - 被“包装”在同步映射中的映射。
返回:
指定映射的同步视图。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马