非常典型的死锁

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

1、定义两个锁

public class MyLock {

	public static final Object LOCKA = new Object();
	public static final Object LOCKB = new Object();
}

2、编写死锁代码

public class DieLock extends Thread {

	private boolean flag;

	public DieLock() {
		super();
	}

	public DieLock(boolean flag) {
		super();
		this.flag = flag;
	}

	@Override
	public void run() {

		if (flag) {
			synchronized (MyLock.LOCKA) {
				System.out.println("if中的LOCKA");
				synchronized (MyLock.LOCKB) {
					System.out.println("if中的LOCKB");
				}
			}
		}else {
			synchronized (MyLock.LOCKB) {
				System.out.println("else中的LOCKB");
				synchronized (MyLock.LOCKA) {
					System.out.println("else中的LOCKA");
				}
			}
		}
	}
}

3、测试

public class Test {

	public static void main(String[] args) {
		DieLock dl1 = new DieLock(true);
		DieLock dl2 = new DieLock(false);
		dl1.start();
		dl2.start();
	
	}
}

运行结果:
在这里插入图片描述
在这里插入图片描述
从运行结果看,程序一直在执行中,进入了死循环。

### 死锁的概念 当两个或多个事务相互持有对方所需的资源而不释放时,就会发生死锁。这种情况下,每个事务都在等待其他事务释放资源,从而形成永久性的阻塞状态[^1]。 ### 典型死锁案例分析 考虑如下场景: 有两个事务T1和T2分别尝试获取同一张表上的不同记录的锁。假设T1已经获得了对A记录的写锁并请求B记录的写锁;与此同时,T2已经持有了B记录的写锁并向A发起同样的请求。此时就形成了一个循环等待条件——即经典的死锁情形。 ```sql -- T1执行语句 START TRANSACTION; UPDATE table_name SET column='value' WHERE id=1; -- T2执行语句,在此之前未提交T1 START TRANSACTION; UPDATE table_name SET column='value' WHERE id=2; -- 接下来如果T1试图更新id=2而T2也恰好要更新id=1,则可能发生死锁 ``` ### 四路交通堵塞类比解释 可以将上述数据库中的死锁现象比喻成四向路口处发生的车辆拥堵状况。在这个例子中,每辆车代表一个事务,道路交叉口则对应着被锁定的数据项(如表格行)。具体来说: - **车流方向**:每一辆汽车都朝着特定的方向前进,这类似于事务按照预定的操作序列访问数据。 - **红绿灯控制机制失效**:如果没有有效的协调手段来管理这些冲突路径之间的交互行为,那么最终可能会陷入无休止的僵局之中,就像没有适当处理并发操作而导致的死锁一样。 - **解决方法**:为了防止这种情况的发生,通常会采用一些预防措施,比如设置超时限制、定期检测潜在的环形依赖关系等策略,就如同现实生活中通过安装信号灯或者安排交警指挥等方式疏导交通流量以避免长时间停滞不前的现象出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值