`
jiadong
  • 浏览: 30718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashMap 变为线程安全的方法

 
阅读更多

HashTable为线程安全的Map对象,但是现在的JDK不提倡使用HashTable

而日常推荐使用的HashMap为非线程安全的对象,通过java.util.Collections可以把HashMap变为线程安全,在需要多线程环境中实现同步时使用。

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

一下内容为JDK中实现的Map同步代码

private static class SynchronizedMap<K,V>
implements Map<K,V>, Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 1978198479659022715L;


private Map<K,V> m; // Backing Map
Object mutex; // Object on which to synchronize


SynchronizedMap(Map<K,V> m) {
if (m==null)
throw new NullPointerException();
this.m = m;
mutex = this;
}


SynchronizedMap(Map<K,V> m, Object mutex) {
this.m = m;
this.mutex = mutex;
}


public int size() {
synchronized(mutex) {return m.size();}
}
public boolean isEmpty(){
synchronized(mutex) {return m.isEmpty();}
}
public boolean containsKey(Object key) {
synchronized(mutex) {return m.containsKey(key);}
}
public boolean containsValue(Object value){
synchronized(mutex) {return m.containsValue(value);}
}
public V get(Object key) {
synchronized(mutex) {return m.get(key);}
}


public V put(K key, V value) {
synchronized(mutex) {return m.put(key, value);}
}
public V remove(Object key) {
synchronized(mutex) {return m.remove(key);}
}
public void putAll(Map<? extends K, ? extends V> map) {
synchronized(mutex) {m.putAll(map);}
}
public void clear() {
synchronized(mutex) {m.clear();}
}


private transient Set<K> keySet = null;
private transient Set<Map.Entry<K,V>> entrySet = null;
private transient Collection<V> values = null;


public Set<K> keySet() {
synchronized(mutex) {
if (keySet==null)
keySet = new SynchronizedSet<K>(m.keySet(), mutex);
return keySet;
}
}


public Set<Map.Entry<K,V>> entrySet() {
synchronized(mutex) {
if (entrySet==null)
entrySet = new SynchronizedSet<Map.Entry<K,V>>((Set<Map.Entry<K,V>>)m.entrySet(), mutex);
return entrySet;
}
}


public Collection<V> values() {
synchronized(mutex) {
if (values==null)
values = new SynchronizedCollection<V>(m.values(), mutex);
return values;
}
}


public boolean equals(Object o) {
synchronized(mutex) {return m.equals(o);}
}
public int hashCode() {
synchronized(mutex) {return m.hashCode();}
}
public String toString() {
synchronized(mutex) {return m.toString();}
}
private void writeObject(ObjectOutputStream s) throws IOException {
synchronized(mutex) {s.defaultWriteObject();}
}
}

分享到:
评论

相关推荐

    HashMap类

    3. **线程安全性**:HashMap不是线程安全的,如果在多线程环境下使用,需要使用Collections.synchronizedMap()进行同步或者使用ConcurrentHashMap,后者是专门为并发设计的哈希映射表。 HashMap类的常见方法包括: ...

    深入解读大厂java面试必考点之HashMap全套学习资料

    4. **线程安全性**:HashMap不是线程安全的,这意味着在多线程环境下,不建议直接使用HashMap。如果需要线程安全的映射,可以使用ConcurrentHashMap,它是Java并发包下的一个高效替代品。 5. **迭代器遍历**:...

    java提高篇(二三)-----HashMap.pdf

    由于HashMap不是线程安全的,如果在多线程环境下使用,应考虑使用`ConcurrentHashMap`或在外部同步HashMap实例。 总的来说,HashMap是Java中常用且高效的键值对存储结构,其性能取决于哈希函数的质量、加载因子和...

    动力节点-HashMap讲义.pdf

    `HashMap` 的实现并不是同步的,这意味着它不是线程安全的。在多线程环境中,多个线程同时访问和修改 `HashMap` 可能会导致数据不一致的问题。因此,在多线程环境下使用 `HashMap` 时,需要外部同步。 #### 数据...

    HashMap和Hashtable的区别

    - `HashMap`是非线程安全的,这意味着在并发环境下,多个线程修改`HashMap`可能会导致数据不一致。开发者需要自己处理线程同步问题,如使用`synchronized`关键字或者`ConcurrentHashMap`。 - `Hashtable`是线程...

    30重点面试题-Fu1

    - 同步特性:HashMap不是线程安全的,而Hashtable是线程安全的。在多线程环境下,如果需要线程安全,可以选择使用Collections.synchronizedMap对HashMap进行包装。 - null处理:HashMap允许存储null键和null值,而...

    Java软件开发实战 Java基础与案例开发详解 12-1 多线程 共18页.pdf

    Java集合框架中的某些类(如`ArrayList`、`HashMap`)默认是非线程安全的,即它们没有提供同步机制来防止多线程环境下的并发修改异常。为了解决这个问题,可以采取以下措施: - 使用同步容器:如`Vector`、`...

    【IT十八掌徐培成】Java基础第09天-004.多线程-状态机变换.zip

    课程可能还会涉及线程安全的数据结构,如ArrayList与Vector、HashMap与ConcurrentHashMap的区别,以及如何在多线程环境下正确地使用它们。线程局部变量(ThreadLocal)也是一个可能讨论的话题,它为每个线程提供独立...

    尚硅谷大厂面试题第二季周阳主讲整理笔记

    - **HashMap**:HashMap是最常用的Map实现,它提供了高效的查找和插入操作,但不是线程安全的。允许存储null键和值。 - **LinkedHashMap**:与HashMap相比,LinkedHashMap维护了一个插入顺序或访问顺序的双向链表,...

    java7hashmap源码-knowledge-juc:知识-juc

    4. **并发问题**:尽管HashMap在单线程环境下表现优秀,但在多线程环境下可能存在安全问题,因为它不是线程安全的。在Java 7中,如果多个线程同时修改HashMap,可能会导致数据不一致。对于并发需求,可以使用`...

    java面试笔记.pdf

    - 为了使***List变为线程安全,可以使用Collections.synchronizedList方法,或者考虑使用ThreadLocal变量。 - CopyOnWriteArrayList是并发的ArrayList,使用了可重入锁来保证线程安全。 2. ArrayList和LinkedList的...

    面试成功宝典

    - **非线程安全**:`HashMap`默认是非线程安全的,这意味着在多线程环境中直接使用`HashMap`可能导致数据不一致。 - **解决方案**:使用`java.util.concurrent.ConcurrentHashMap`,它通过内部实现的读写锁来确保...

    Java面试精选72题及答案整理.pdf

    `HashMap`是非线程安全的`Hashtable`的轻量级实现,两者都实现了`Map`接口。`HashMap`允许`null`键和值,而`Hashtable`不允许。此外,`HashMap`不包含`Hashtable`的`contains`方法,改为了`containsValue`和`...

    手写Java HaspMap

    但是,HashMap不是线程安全的,如果在多线程环境下使用,需使用ConcurrentHashMap。另外,HashMap不保持元素的顺序,而LinkedHashMap则可以按照插入顺序或访问顺序维护元素。 **7. 注意事项** - 使用合适的键类型,...

    JAVA面试-集合知识点汇总(高频、经典).doc

    `HashMap`不是线程安全的,主要原因在于它的多个方法(如`put`方法)没有被同步。在并发环境中,如果没有适当的同步措施,可能会出现数据不一致的问题,例如: - 并发插入时可能导致链表形成环形结构。 - 并发修改...

    Java程序员集合框架面试题-java集合框架面试题.docx

    如果需要将`HashMap`变为线程安全,可以使用`Collections.synchronizedMap()`方法,将其转换为同步映射,但这并不等同于`HashTable`,因为同步机制和性能表现不同。 6. **选择使用Hashtable还是HashMap** 当需要...

    Java集合思维导图.xmind.zip

    HashMap不是线程安全的,因此在多线程环境下需要额外的同步控制。 2. **CurrentHashMap**: 从Java 5开始引入,CurrentHashMap是HashMap的一个线程安全版本。它通过分段锁机制来提高并发性能,允许多个线程同时读写...

    JAVA面试题

    6. 在 Java 集合框架中,Vector 是线程安全的,而 HashMap 不是线程安全的。为了实现线程安全,可以使用 Collections.synchronizedMap() 或 ConcurrentHashMap。 7. 当一个方法抛出异常,该方法会终止,但整个程序...

    java葵花宝典

    ArrayList和HashMap是非线程安全的。 3. 正确的字符串叙述是B和C。大量字符串相加使用StringBuilder或StringBuffer(如果有线程安全需求)更为高效,因为它们的append方法避免了创建新的字符串对象。 这些内容涵盖...

    2018年阿里一面面试题整理集合

    - **线程安全性**:HashMap是非线程安全的;HashTable是线程安全的,通过`synchronized`关键字实现。 #### HashMap与ConcurrentHashMap **主要区别** - **线程安全性**:ConcurrentHashMap通过分段锁技术保证线程...

Global site tag (gtag.js) - Google Analytics