首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java细粒度锁实现的3种方式(1) 分段锁

Java细粒度锁实现的3种方式(1) 分段锁

1. 分段锁借鉴concurrentHashMap的分段思想,先生成一定数量的锁,具体使用的时候再根据key来返回对应的lock。这是几个实现里最简单,性能最高,也是最终被采用的锁策略,代码如下:
[url=][/url]
/** * 分段锁,系统提供一定数量的原始锁,根据传入对象的哈希值获取对应的锁并加锁 * 注意:要锁的对象的哈希值如果发生改变,有可能导致锁无法成功释放!!! */public class SegmentLock<T> {    private Integer segments = 16;//默认分段数量    private final HashMap<Integer, ReentrantLock> lockMap = new HashMap<>();    public SegmentLock() {        init(null, false);    }    public SegmentLock(Integer counts, boolean fair) {        init(counts, fair);    }    private void init(Integer counts, boolean fair) {        if (counts != null) {            segments = counts;        }        for (int i = 0; i < segments; i++) {            lockMap.put(i, new ReentrantLock(fair));        }    }    public void lock(T key) {        ReentrantLock lock = lockMap.get(key.hashCode() % segments);        lock.lock();    }    public void unlock(T key) {        ReentrantLock lock = lockMap.get(key.hashCode() % segments);        lock.unlock();    }}
返回列表