Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83200
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-02 20:25
文章分类

全部博文(31)

文章存档

2015年(2)

2014年(29)

我的朋友

分类: Java

2014-09-01 17:13:13

     当一个资源可以分成很多部分的时候,如果对每个部分使用不同的锁,那么资源的争用就大大的降低,这是使用分离锁的理由。并发包中的ConcurrentHashMap是分离锁的典型例子。
 
    一个简单的使用分离锁的map可以很快的被写出来:

点击(此处)折叠或打开

  1. package lock;

  2. import java.util.HashMap;
  3. import java.util.concurrent.locks.ReentrantReadWriteLock;

  4. @SuppressWarnings("rawtypes")
  5. public class SptMap {

  6.     private int seg = 16;
  7.     
  8.     private HashMap[] maps = null;
  9.     private ReentrantReadWriteLock[] locks = null;
  10.     
  11.     private void init(){
  12.         for(int i=0;i<seg;i++){
  13.             maps[i] = new HashMap();
  14.             locks[i] = new ReentrantReadWriteLock();
  15.         }
  16.     }
  17.     
  18.     public SptMap(int seg){
  19.         this.seg = seg;
  20.         init();
  21.     }
  22.     
  23.     public SptMap(){
  24.         init();
  25.     }
  26.     
  27.     
  28.     private int ids(Object k){
  29.         return k.hashCode()%seg;
  30.     }
  31.     
  32.     @SuppressWarnings("unchecked")
  33.     public void put(Object k, Object v){
  34.         int i = ids(k);
  35.         locks[i].writeLock().lock();
  36.         try{
  37.             maps[i].put(k, v);
  38.         }finally{
  39.             locks[i].writeLock().unlock();
  40.         }
  41.     }

  42.     public Object get(Object k){
  43.         int i = ids(k);
  44.         Object o = null;
  45.         locks[i].readLock().lock();
  46.         try{
  47.             o = maps[i].get(k);
  48.         }finally{
  49.             locks[i].readLock().unlock();
  50.         }
  51.         return o;
  52.     }
  53.  }

阅读(1009) | 评论(0) | 转发(0) |
0

上一篇:1.读写锁

下一篇:4.终止线程

给主人留下些什么吧!~~