死锁

简介

两个及以上的线程, 因资源争夺无法继续执行。

四个必要条件

  1. 互斥: 在相同时间下, 资源只能被一个进程所持有。
  2. 不剥夺: 资源只能被线程主动释放, 不可被抢夺。
  3. 请求和保持: 线程请求已被其他线程持有的资源, 无法获取,进入等待模式,且自身持有资源不释放。
  4. 循环等待: 存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个进程所请求。

原因

  1. 资源争夺
    不可剥夺的资源,不足以满足多线程需要, 使得线程间相互争夺而陷入僵局。

  2. 推进顺序非法
    进程在运行过程中,释放和请求资源的顺序不当,也同样会导致死锁。

如何避免死锁

  1. 锁持有顺序
  2. 锁超时策略
  3. 主动检测死锁

示例代码

public class LockDemo {
	private static Object lockA = new Object();
	private static Object lockB = new Object();
	public static void main(String[] args) {
		new Thread(new Runnable() {
			public void run() {
				while(true) {
					methodB();
					try{
						Thread.sleep(300);
					} catch (Exception e) {}
				}
			}
		}).start();
	
		new Thread(new Runnable() {
			public void run() {
				while(true) {
					methodA();
					try{
						Thread.sleep(300);
					} catch (Exception e) {}
				}
			}
		}).start();
	}
	public static void methodA() {
		synchronized(lockA) {
			synchronized(lockB) {
				System.out.println("methodA");
			}
		}
		
	}
	public static void methodB() {
		synchronized(lockB) {
			synchronized(lockA) {
				System.out.println("methodB");
			}
		}
	}

	public static void methodC() {
		synchronized(lockA) {
			synchronized(lockB) {
				System.out.println("methodC");
			}
		}
		
	}
	public static void methodD() {
		synchronized(lockA) {
			synchronized(lockB) {
				System.out.println("methodD");
			}
		}
	}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值