java线程终结的问题

问题描述

将捕捉可重入锁的try catch放while循环外为什么线程不退出?如果是放在while循环里面线程是可以正常结束的。是跟lock的解锁位置有关么?不知道是啥原理。。

相关代码

粘贴代码文本(请勿用截图)

public class LockTest {
    public static void main(String[] args) {
        LockThread lockThread = new LockThread();
        new Thread(lockThread).start();
        new Thread(lockThread).start();
        new Thread(lockThread).start();
    }
}


class LockThread implements Runnable {
    private final ReentrantLock lock = new ReentrantLock();
    int tickets = 10;

    @Override
    public void run() {
        try {
            while (true) {

                lock.lock();
                if (tickets > 0) {
                    System.out.println(tickets--);
                } else {
                    break;
                }
            }
        } finally {
            lock.unlock();
        }
    }
}

结果:
image.png

阅读 2.3k
3 个回答

入锁多少次,就要出锁多少次

新手上路,请多包涵

明确一点,finally代码块是在try中的代码报异常时才会走,所以try在while外的话,且lock在while内,那么如果while内没有报错,则永远不会走finally里的unlock方法

着代码写得异常混乱,还是先系统学习下吧。可重入锁一般遵循jvm lock语义,多少次lock,就需要执行多少次unlock。你这么写,所有的票都是在一个线程里面卖出去的,其他两个线程直接被锁死了。这也是ReentrantLock 危险的地方,所以使用ReentrantLock 才一般模板化使用。但一般人是忘记unlock,你这直接是故意让它锁死。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题