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
两次锁才被真正的释放掉。