当一个资源可以分成很多部分的时候,如果对每个部分使用不同的锁,那么资源的争用就大大的降低,这是使用分离锁的理由。并发包中的ConcurrentHashMap是分离锁的典型例子。
一个简单的使用分离锁的map可以很快的被写出来:
-
package lock;
-
-
import java.util.HashMap;
-
import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-
@SuppressWarnings("rawtypes")
-
public class SptMap {
-
-
private int seg = 16;
-
-
private HashMap[] maps = null;
-
private ReentrantReadWriteLock[] locks = null;
-
-
private void init(){
-
for(int i=0;i<seg;i++){
-
maps[i] = new HashMap();
-
locks[i] = new ReentrantReadWriteLock();
-
}
-
}
-
-
public SptMap(int seg){
-
this.seg = seg;
-
init();
-
}
-
-
public SptMap(){
-
init();
-
}
-
-
-
private int ids(Object k){
-
return k.hashCode()%seg;
-
}
-
-
@SuppressWarnings("unchecked")
-
public void put(Object k, Object v){
-
int i = ids(k);
-
locks[i].writeLock().lock();
-
try{
-
maps[i].put(k, v);
-
}finally{
-
locks[i].writeLock().unlock();
-
}
-
}
-
-
public Object get(Object k){
-
int i = ids(k);
-
Object o = null;
-
locks[i].readLock().lock();
-
try{
-
o = maps[i].get(k);
-
}finally{
-
locks[i].readLock().unlock();
-
}
-
return o;
-
}
-
}
阅读(1017) | 评论(0) | 转发(0) |