什么是死锁?

什么是死锁?

线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法前往执行,如果线程都不主动释放所占有的资源,将产生死锁。

当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

 

 

产生原因:

持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。(不可剥夺资源如打印机等)

持有资源的锁,去竞争锁已被占用的其他资源,形成程序僵死的争关系。

信号量使用不当。

...

 

如线程A占有资源 1 的锁,去竞争资源 2 的锁;线程 B 占有资源 2 的锁,去竞争资源1的锁。代码表现如下

public class TestDeadLock {

	final static Object o1 = new Object();
	
	final static Object o2 = new Object();
	
	public static void main(String[] args) {
		//先持有 o1 的锁,再去获取 o2 的锁
		Thread t1 = new Thread() {
			
			@Override
			public void run() {
				synchronized (o1) {
					System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o1 对象的锁");
					try {
						System.out.println("休眠1秒");
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o2 对象的锁");
					synchronized (o2) {
						System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o2 对象的锁");
					}
				}
			}
			
		};
		
		//先持有 o2 的锁,再去获取 o1 的锁
		Thread t2 = new Thread() {
			
			@Override
			public void run() {
				synchronized (o2) {
					System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o2 对象的锁");
					try {
						System.out.println("休眠1秒");
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o1 对象的锁");
					synchronized (o1) {
						System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o1 对象的锁");
					}
				}
			}
			
		};
		
		
		t1.start();
		t2.start();
	}
	
}

 打印结果:

线程:Thread-1 获取到 o2 对象的锁
休眠1秒
线程:Thread-0 获取到 o1 对象的锁
休眠1秒
线程:Thread-0 去获取 o2 对象的锁
线程:Thread-1 去获取 o1 对象的锁

 


【Java面试题与答案】整理推荐

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值