首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

各种加锁步骤对于Map[转载]

2013-08-01 
各种加锁方法对于Map[转载]hashmap是不带有锁的,hashtable是带有锁的,多线程使用过程中,需要对hashmap加锁

各种加锁方法对于Map[转载]
hashmap是不带有锁的,hashtable是带有锁的,多线程使用过程中,需要对hashmap加锁,可以用

1.使用 synchronized 关键字,这也是最原始的方法。代码如下

synchronized(anObject)  {        value = map.get(key);}  

2.使用 JDK1.5 提供的锁(java.util.concurrent.locks.Lock)。代码如下
lock.lock();   value = map.get(key);   lock.unlock();  

3.这样处理时对于hashmap的读写都加锁了,但是如果涉及到少量插入及频繁的查找,那么上面两种的效率不是很高,这时候最好的方式是加读写锁。以下为构造读写锁包装map的方法:
import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteMap<K, V> {private final Map<K, V> map;private final ReadWriteLock lock = new ReentrantReadWriteLock();private final Lock r = lock.readLock();private final Lock w = lock.writeLock();public ReadWriteMap(Map<K, V> map) {this.map = map;}public V put(K key, V value) {w.lock();try {return map.put(key, value);} finally {w.unlock();}}public V get(Object key) {r.lock();try {return map.get(key);} finally {r.unlock();}}}

4、使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 类。该类将 Map 的存储空间分为若干块,每块拥有自己的锁,大大减少了多个线程争夺同一个锁的情况。代码如下
value = map.get(key); //同步机制内置在 get 方法中

这种方式最快


结论:

1、如果 ConcurrentHashMap 够用,则使用 ConcurrentHashMap。
2、如果需自己实现同步,则使用 JDK1.5 提供的锁机制,避免使用 synchronized 关键字。

热点排行