HashMap 变为线程安全的方法

本文深入解析了Java中的线程安全Map对象,包括HashTable与HashMap的区别,以及如何利用Collections工具类将非线程安全的HashMap变为线程安全。通过分析JDK源码,了解了SynchronizedMap类如何实现同步逻辑,确保多线程环境下的数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

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

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

  private static classSynchronizedMap<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 tosynchronize


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


SynchronizedMap(Map<K,V> m, Objectmutex) {
          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) {returnm.containsKey(key);}
       }
public boolean containsValue(Object value){
   synchronized(mutex) {returnm.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, ? extendsV> map) {
   synchronized(mutex) {m.putAll(map);}
       }
public void clear() {
   synchronized(mutex) {m.clear();}
}


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


public Set<K> keySet() {
          synchronized(mutex) {
              if(keySet==null)
                 keySet = newSynchronizedSet<K>(m.keySet(),mutex);
              returnkeySet;
          }
}


publicSet<Map.Entry<K,V>>entrySet() {
          synchronized(mutex) {
              if(entrySet==null)
                 entrySet = newSynchronizedSet<Map.Entry<K,V>>((Set<Map.Entry<K,V>>)m.entrySet(),mutex);
              returnentrySet;
          }
}


public Collection<V> values() {
          synchronized(mutex) {
              if(values==null)
                 values = newSynchronizedCollection<V>(m.values(),mutex);
              returnvalues;
          }
       }


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 voidwriteObject(ObjectOutputStream s) throws IOException {
   synchronized(mutex){s.defaultWriteObject();}
       }
    }


转自: http://blog.youkuaiyun.com/olatero/article/details/6617833

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值