您的位置:首页技术文章
文章详情页

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

【字号: 日期:2024-02-11 18:16:07浏览:59作者:猪猪

问题描述

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;}@Overridepublic 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是否获得了锁:trueThread-0Thread-1是否获得了锁:falseThread-0释放了锁

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

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

请问这是为什么?

问题解答

回答1:

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

标签: java