黑马程序员技术交流社区

标题: 为什么if的循环判定在lock锁外时会无限进行下去 [打印本页]

作者: yyl110    时间: 2018-7-26 19:49
标题: 为什么if的循环判定在lock锁外时会无限进行下去
  Lock l = new ReentrantLock();
    @Override
    public void run() {
        while(true){
            l.lock();
            if(num == 0){
                break;
            }
            String name = Thread.currentThread().getName();
            System.out.println(name+"卖出了第"+(1000-num + 1)+"张票,还剩"+(--num)+"张");
            l.unlock();
            if(num == 0){
                break;
            }
        }
    }
}
if判定在lock内代码上时程序不动但是没有停止,只有在代码下在加一次if判定程序才会停止运行

作者: 晏汶    时间: 2018-7-27 00:02
你试试给下面的if去掉,再在上面的if里面break上面加一行l.unlock
作者: 晏汶    时间: 2018-7-27 02:34
可能是因为没有释放锁吧,锁死了.虽然是根据现象猜的
作者: yyl110    时间: 2018-7-27 10:43
晏汶 发表于 2018-7-27 02:34
可能是因为没有释放锁吧,锁死了.虽然是根据现象猜的

下面那个if去掉会出现另一个问题
作者: 摩西摩西OvO    时间: 2018-7-27 11:17

作者: yyl110    时间: 2018-7-27 14:39
摩西摩西OvO 发表于 2018-7-27 11:17


作者: 晏汶    时间: 2018-7-27 21:25
yyl110 发表于 2018-7-27 10:43
下面那个if去掉会出现另一个问题

int i = 100;
    Lock l = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            l.lock();
            if (i <= 0) {
                l.unlock();
                break;
            }
            i--;
            System.out.println(Thread.currentThread().getName() + "卖出了第" + (100 - i) + "张票,还剩" + i + "张");
            l.unlock();
        }
    }
你确定会出现另一个问题?什么问题呢,我试了下没啥问题啊
Thread-2卖出了第97张票,还剩3张
Thread-2卖出了第98张票,还剩2张
Thread-2卖出了第99张票,还剩1张
Thread-2卖出了第100张票,还剩0张
代码正常结束
作者: gzsba    时间: 2018-7-28 00:42
这是个问题,值得分析一下
作者: yyl110    时间: 2018-7-28 19:43
晏汶 发表于 2018-7-27 21:25
int i = 100;
    Lock l = new ReentrantLock();

忘了,我记得当时除了别的问题
作者: yyl110    时间: 2018-7-28 19:44
gzsba 发表于 2018-7-28 00:42
这是个问题,值得分析一下






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2