多线程-死锁

本文深入探讨了死锁的概念,包括互斥条件、请求和保持条件、不剥夺条件及循环等待条件。通过一个具体的Java代码示例展示了两个线程互相等待对方资源导致的死锁情况,说明了死锁产生的原因和过程。了解这些对于避免并发编程中的死锁问题至关重要。
摘要由CSDN通过智能技术生成

死锁的定义:

  • 两个或多个线程互相持有对方所需的资源,这些线程会互相等待对方释放资源,如果线程都不主动释放所占有的资源,这些线程都会处于等待状态,无法继续执行,产生死锁

死锁产生的条件:

  1. 互斥条件:线程对所分配的资源具有排他性,即一个资源只能被一个线程占用,直到该线程释放该资源;
  2. 请求和保持条件:一个线程因请求被占用资源而发生阻塞时,对已获得的资源保持不放;
  3. 不剥夺条件:任何一个备战有的资源在没被该线程释放之前,任何其他线程都无法对他进行剥夺占用;
  4. 循环等待条件:当发生死锁时,所等待的线程必定会形成一个死循环,造成永久阻塞。

死锁举例:

  1. 线程1首先占有对象1,接着试图占有对象2
  2. 线程2首先占有对象2,接着试图占有对象1
  3. 线程1等待线程2释放对象2
  4. 线程2等待线程1释放对象1
  5. 线程1和线程2形成死循环,死锁产生

代码展示

public class DeadLock {
	//演示死锁
	public static void main(String[] args) {
		//创建两个对象->对象1和对象2
		final Object o1 = new Object();
		final Object o2 = new Object();
		
		//创建线程1:首先占有对象1,接着试图占有对象2
		Thread t1 = new Thread(){
			public void run(){
				//首先占有对象1
				synchronized (o1) {
					System.out.println( "t1已经占有对象o1" );
					try {
						//提供足够的时间让线程2占有对象o2
						Thread.sleep( 10000 );
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					//接着试图占有对象2
					System.out.println( "t1试图占有对象o2" );
					System.out.println( "t1等待中" );
					synchronized ( o2 ) {
						System.out.println( "do something" );
					}
				}
			}
		};
		t1.start();
		
		//创建线程2:首先占用对象2,接着试图占用对象1
		Thread t2 = new Thread(){
			public void run(){
				//首先占有对象o2
				System.out.println( "t2已经占用对象o2" );
				synchronized (o2) {
					try {
						//提供足够的时间让线程1占有对象o1
						Thread.sleep( 10000 );
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					//接着试图占用对象o1
					System.out.println( "t2试图占用对象o1" );
					System.out.println( "t2等待中" );
					synchronized (o1) {
						System.out.println( "do something" );
					}
				}
			}
		};
		t2.start();
	}
}

输出结果

t1已经占有对象o1
t2已经占用对象o2
t2试图占用对象o1
t2等待中
t1试图占有对象o2
t1等待中

PS:2020年11月12日网易有道后台开发实习面试题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值