死锁的简单实现结合线程的生命周期

线程的生命周期

new(新建):线程创建

Runnable(就绪):没有抢到时间片

Running(运行):抢到了时间片,CPU开始处理这个线程中的任务

Blocked(阻塞):线程在执行过程中遇到特殊情况,使得其他线程就可以获得执行的机会,被阻塞的线程会等待合适的时机重新进入就绪状态

Dead(死亡):线程终止   a. run方法执行完成,线程正常结束       b. 直接调用该线程的stop方法强制终止这个线程

public class Demo3 {

	private static Object obj1 = new Object();
	private static Object obj2 = new Object();
	private static boolean flag = true;

	private static Runnable r = new Runnable() {

		@Override
		public void run() {
			while (true) {
				if (flag) {
					synchronized (obj1) {// 对象锁
						System.out.println(Thread.currentThread().getName() + "获得第一个对象obj1");
						flag = !flag;
						// 第一个线程在此等侯obj2
						try {
							Thread.sleep(5000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						synchronized (obj2) {
							System.out.println(Thread.currentThread().getName() + "获得第二个对象obj2");
						}
					}
				} else {
					synchronized (obj2) {
						// 第二个线程持有了obj2
						System.out.println(Thread.currentThread().getName() + "获得第二个对象obj2");
						flag = !flag;
						// 第二个线程在此等侯obj1
						synchronized (obj1) {
							System.out.println(Thread.currentThread().getName() + "获得第一个对象obj2");
						}
					}
				}
			}
		}
	};

	public static void main(String[] args) {
		Thread t1 = new Thread(r);
		Thread t2 = new Thread(r);
		t2.start();
		t1.start();
	}
}

前两个不用看,多次循环,出现死锁,后两个各自拿着对方所需要的,又不释放自己所拥有的,导致了死锁的出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值