这是分段锁的代码
public class SegementLock<T> {
private int segementCount=16;
private final Map<Integer, ReentrantLock> lockMap=new HashMap<>();
public SegementLock() {
init(null, false);
}
public SegementLock(Integer count,boolean fair){
init(count, fair);
}
private void init(Integer count,boolean fair){
if(count!=null){
segementCount=count;
}
for(int i=0;i<segementCount;i++){
lockMap.put(i, new ReentrantLock(fair));
}
}
public boolean lock(T key){
ReentrantLock lock = lockMap.get(Math.abs(key.hashCode() % segementCount));
System.out.println("获取"+Math.abs(key.hashCode() % segementCount)+"号锁");
if(lock.tryLock()){
lock.lock();
return true;
}
return false;
}
public void unlock(T key){
ReentrantLock lock = lockMap.get(Math.abs(key.hashCode() % segementCount));
System.out.println("释放+"+Math.abs(key.hashCode() % segementCount)+"号锁");
lock.unlock();
}
}
这是测试代码
public static void main(String[] args) throws InterruptedException {
final SegementLock<String> lock=new SegementLock<>();
lock.lock("1234");
lock.unlock("1234");
new Thread(new Runnable() {
@Override
public void run() {
if(lock.lock("12345")){
System.out.println("线程获取锁");
lock.unlock("12345");
}
}
}).start();
if(lock.lock("1234")){
System.out.println("main 获取" );
lock.unlock("1234");
}
Thread.sleep(3000);
if(lock.lock("12345")){
System.out.println("main获取锁 12345");
lock.unlock("12345");
}
}
理应是key=1234的锁主线程获取并释放 然后其它线程获取key=12345的锁然后释放,最后线程休眠3秒,然后在获取key=12345的锁,但就是获取不了啊,锁都释放了啊,谁知道啊啊
这是控制台输出代码
获取2号锁
释放+2号锁
获取2号锁
main 获取
释放+2号锁
获取3号锁
线程获取锁
释放+3号锁
获取3号锁 -===应该紧接着获取锁之后 输出main获取锁12345 但是就是不能获取到