死锁demo

本文深入解析了Java程序中死锁的概念、原因,并通过具体代码实例展示了死锁的发生过程及其解决策略。重点阐述了如何通过合理设计线程同步机制避免死锁,确保程序稳定运行。
package com.jd.schdule;

/**
 * 死锁
 * @author yfzhangbin
 */
public class DeadlockTest {
	public static Object lock1 = new Object();
	public static Object lock2 = new Object();
	
	public static void deadlock() {
		new Thread(new Runnable() {	// 线程T1
			public void run() {
				synchronized(lock1) {
					System.out.println(1);
					try {
						Thread.sleep(1000);
					} catch(Exception e) {
						e.printStackTrace();
					}
					synchronized(lock2) {	// 线程T1持有锁lock1,并等待线程T2释放锁lock2
						System.out.println(2);
					}
				}
			}
		}).start();
	  
		new Thread(new Runnable() {	// 线程T2
			public void run() {
				synchronized (lock2) {
					System.out.println(3);
					synchronized (lock1) {	// 线程T2持有锁lock2,等待线程T1释放锁lock1
						System.out.println(4);
					}	
				}	
			}
		}).start();
	}

	public static void main(String[] a){
		deadlock();
	}
}

 输出:

1
3
进入死锁状态,进入无限等待中。

 

 

<think>好的,用户之前让我提供了一个Java多线程转账导致异常的示例,现在他们要求再给一个死锁demo。我需要先回顾之前的例子,确保这次展示的是死锁的情况。 首先,死锁的四个必要条件:互斥、持有并等待、不可抢占、循环等待。我需要设计一个例子满足这些条件。之前的转账例子可能没有显式的锁,所以这次需要引入锁机制。 用户可能希望看到明确的锁对象,比如使用synchronized或者ReentrantLock。考虑到之前的例子用了synchronized方法,可能这次继续用synchronized块,或者改用ReentrantLock来展示不同的方式。 转账过程中,两个账户互相等待对方的锁。例如,线程1锁住账户A,然后尝试锁住账户B;同时线程2锁住账户B,再尝试锁住账户A。如果同时发生,就会导致死锁。 需要确保代码结构清晰,展示出死锁的形成。可能需要显式地使用synchronized(this)或者Lock的lock()方法。另外,应该给出运行结果,说明程序挂起,无法继续执行。 还要考虑用户可能的问题,比如如何检测死锁,或者如何避免。所以在相关问题中需要包含这些点,帮助用户深入理解。 最后,确保代码正确,没有语法错误,并且注释清楚。可能还要提醒用户运行时需要终止程序,因为死锁会导致无法自动退出。</think>以下是经典的死锁示例(哲学家进餐问题的变种): ```java class DeadlockDemo { // 两个账户资源 private final Object accountA = new Object(); private final Object accountB = new Object(); // 转账操作1:A→B public void transferAB() { synchronized (accountA) { System.out.println(Thread.currentThread().getName() + " 锁定账户A"); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (accountB) { System.out.println(Thread.currentThread().getName() + " 开始转账AB"); } } } // 转账操作2:B→A public void transferBA() { synchronized (accountB) { System.out.println(Thread.currentThread().getName() + " 锁定账户B"); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (accountA) { System.out.println(Thread.currentThread().getName() + " 开始转账BA"); } } } public static void main(String[] args) { DeadlockDemo demo = new DeadlockDemo(); // 线程1:执行A→B转账 new Thread(() -> { while (true) { demo.transferAB(); } }, "线程1").start(); // 线程2:执行B→A转账 new Thread(() -> { while (true) { demo.transferBA(); } }, "线程2").start(); } } ``` 运行现象: 1. 控制台输出会卡在以下状态: ``` 线程1 锁定账户A 线程2 锁定账户B ``` 2. 程序无法继续执行,两个线程相互等待 3. 必须强制终止程序运行
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值