java线程终结的问题

减不了肥的小李
  • 9

问题描述

将捕捉可重入锁的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

回复
阅读 853
3 个回答

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

St_ronger
  • 2
新手上路,请多包涵

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

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

宣传栏