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);