HashMap 变为线程安全的方法

来源:互联网 发布:xilinx ise软件 编辑:程序博客网 时间:2024/05/01 07:00

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.csdn.net/olatero/article/details/6617833

原创粉丝点击