java编程--死锁详解

本文详细介绍了死锁的概念,包括死锁的定义、产生死锁的常见情况,如交叉锁、内存不足等,并剖析了死锁产生的四个必要条件。此外,还探讨了死锁的预防策略和解除方法,包括资源预分配、线程按编号申请资源以及抢占和终止进程等措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是死锁

如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。

二.产生死锁的常见情况

1.交叉锁


package com.btt.test;
 
public class DeadLock {
	private Object A = new Object();
	private Object B = new Object();
	
	public void run() {
		System.out.println("开始执行线程");
	}
	public Object getA() {
		return A;
	}
	public void setA(Object a) {
		A = a;
	}
	public Object getB() {
		return B;
	}
	public void setB(Object b) {
		B = b;
	}
	
	public static void main(String[] args) {
		final DeadLock dl1 = new DeadLock();
		
		Runnable r1 = new Runnable() {
			public void run() {
				synchronized (dl1.getA()) {
					
					String tName = Thread.currentThread().getName();
					
					System.out.println("我是线程" + tName + ",我拿到了A对象的锁");
					
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("我需要拿B对象的锁啦");
					synchronized (dl1.getB()) {
						System.out.println("线程1开始跑了");
					}
				};
			}
		};
		
		
		Runnable r2 = new Runnable() {
			public void run() {
				synchronized (dl1.getB()) {
					String tName = Thread.currentThread().getName();
					System.out.println("我是线程" + tName + ",我拿到了B对象的锁");
					
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("我需要拿A对象的锁啦");
					synchronized (dl1.getA()) {
						System.out.println("线程2开始跑了");
					};
				};
			}
		};
		
		Thread t1 = new Thread(r1); 
		t1.setName("t1");
		t1.start();
		
		
		Thread t2 = new Thread(r2);
		t2.setName("t2");
		t2.start();
	}
	
	}
	

2.内存不足
线程A使用10MB 系统剩余内存20MB,线程B使用30MB,内存不足造成死锁
3.一问一答的数据交换
server等待client访问
client发送请求到server,等待接收数据
4.死循环引起的死锁
HashMap引起的死锁
参考博文:https://blog.youkuaiyun.com/dingjianmin/article/details/79780350

三.死锁的避免,检测,形成原因

1.产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不可抢占条件:进程已获得的资源,在末使用完之前,不能强行剥夺,只能在进程使用完时由自己释放。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2.死锁的预防
1)允许某些线程同时访问某些资源
2)允许线程强行去夺取某些资源
3)允许实现资源预分配策略
4)线程按照编号申请资源
3.死锁的解除:
一旦检测出死锁,就应立即釆取相应的措施,以解除死锁。死锁解除的主要两种方法:

  1. 抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。
  2. 终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值