精华帖 (0) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-17
sniffer123 写道 LZ你自己的写法有问题啊。。跟HASH是不是 2的幂一点关系也没有
hash & (LOCK_NUM - 1) 能等同 hash % (LOCK_NUM - 1)吗? 假如LOCK_NUM = 14,那么 (LOCK_NUM - 1) 就是 二进制 1101 你用&,第二位永远都是会被去掉的,简单点说,如果hash 是 1~100,&后出来的结果分布肯定是不平均的 之所以会出现你那个只要是2^n就会分布平均,是因为这个时候,2^n的二进制是 1111,&出来相当于取低四位。 恩,在SplitReentrantLock 中使用hash & (LOCK_NUM - 1)确实达不到平均分布的要求。 直接拷贝hashMap.index(...),刚开始没注意,测试过后才发现的。 我没说和hash值有关。 只是和数组的长度有关。 |
|
返回顶楼 | |
发表时间:2011-02-18
LZ分析有道理,最后的&操作,(LOCK_NUM - 1)的二进制1越多,越是平均分布,反过来说,也就是2^n会平均分布。
|
|
返回顶楼 | |
发表时间:2011-02-18
楼主为什么要自己实现分离锁呢?
java.util.concurrent.ConcurrentHashMap<K,V> 这个已经帮你搞定了 |
|
返回顶楼 | |
发表时间:2011-02-18
javantsky 写道 楼主为什么要自己实现分离锁呢?
java.util.concurrent.ConcurrentHashMap<K,V> 这个已经帮你搞定了 分离锁和Map没什么必然的关系呀。 分离锁的应用场景和Map的应用场景不同呀。 要求这样: SplitReentrantLock locks = new SplitReentrantLock(16); Lock lock =locks.getLock(key); lock.lock(); try{ //...... }finally{ lock.unlock(); } |
|
返回顶楼 | |