java - 为什么第一个线程已经释放了锁,第二个线程却不行?

查看:124
本文介绍了java - 为什么第一个线程已经释放了锁,第二个线程却不行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

public class ReentrantLockDemo {

    private Lock lock = new ReentrantLock();

    public void doSomeThing() {
        System.out.println(Thread.currentThread().getName()+"是否获得了锁:"+lock.tryLock());
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(3000);
        } catch (Exception e) {
        } finally {
            System.out.println(Thread.currentThread().getName()+"释放了锁");
            lock.unlock();
        }

    }

    static class MyRunable implements Runnable {

        private ReentrantLockDemo demo;

        public MyRunable(ReentrantLockDemo demo) {
            this.demo = demo;
        }

        @Override
        public void run() {
            demo.doSomeThing();
        }

    }

    public static void main(String[] args) throws InterruptedException {
    ReentrantLockDemo demo = new ReentrantLockDemo();
        new Thread(new MyRunable(demo)).start();
        Thread.sleep(1000);
        new Thread(new MyRunable(demo)).start();
    }
}

输出:
Thread-0是否获得了锁:true
Thread-0
Thread-1是否获得了锁:false
Thread-0释放了锁

然后就卡在这里了。没有任何结果。可能是发生了死锁。

如果我去掉这句话,一切就是正常的:
System.out.println(Thread.currentThread().getName()+"是否获得了锁:"+lock.tryLock());

请问这是为什么?

解决方案

你用的是可重入锁,在Thread0在调用tryLock的时候,如果当前锁可获得,会立刻获取锁,后面你又调用了一次lock,由于Thread0已经获取了锁,所以可重入锁的state等于2,所以 Thread0 释放锁的时候要unlock两次锁才被真正的释放掉。

这篇关于java - 为什么第一个线程已经释放了锁,第二个线程却不行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆