Maximum lock count exceeded的原因以及解决方法

在学习线程锁中,照着书上敲了一遍代码后发现,输出结果过一会后会出现这样的问题:在这里插入图片描述
源码如下:

package lam;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Station{
	public static void main(String[] args) {
		LThread lt=new LThread();
		new Thread(lt,"窗口1").start();
		new Thread(lt,"窗口2").start();
		new Thread(lt,"窗口3").start();
	}
}
class LThread implements Runnable{
private int tic=10;
private final Lock lock=new ReentrantLock();

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			lock.lock();
			if(tic>0) {
				System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					lock.unlock();
				}
			}
		}
	}
	
}

在这里插入图片描述
当tic==0时,给当前窗口上锁了,但是,我们并没有给它释放锁
下面展示一些 内联代码片

while(true) {
			lock.lock();
			if(tic>0) {
				System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
				try {
					Thread.sleep(100);
					System.out.println(lock);//显示锁的状态
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					lock.unlock();
					System.out.println(lock);//输出显示锁的状态
				}
			}
			else {
				//lock.unlock();
				System.out.println("dd");
				System.out.println(Thread.currentThread().getName());
				System.out.println(lock);
				break;
			}

		}

在这里插入图片描述
如图显示,当tic==0时,窗口2正在进行线程,因为没有对它释放锁,所以它是被锁住的,进程就一直在执行中。
要解决这个问题就只需要设置一个else,里面释放锁,然后用break跳出循环(一定要有break)
解决方法:
下面展示一些 内联代码片

public void run() {
		// TODO Auto-generated method stub
		while(true) {
			lock.lock();
			if(tic>0) {
				System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
				try {
					Thread.sleep(100);
					System.out.println(lock);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					lock.unlock();
					System.out.println(lock);
				}
			}
			else {
				lock.unlock();
				break;
			}

		}
		
	}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值