求大神啊,哪位大神对java重入锁比较理解求教

这是分段锁的代码
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 但是就是不能获取到


全部评论
没人吗抢沙发啊啊
点赞 回复 分享
发布于 2018-08-11 17:52
trylock 和lock acquire二次了 可重入
点赞 回复 分享
发布于 2018-08-11 18:00

相关推荐

点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务