Java面试八股之死锁和活锁的区别

  1. 死锁和活锁的区别

基本定义:

死锁(Deadlock):指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的状态。每个线程至少持有一个资源,并等待另一个由其他线程持有的资源,形成了一个等待环路,没有外部干预(如系统中断或特殊处理),这些线程将永远阻塞。

活锁(Livelock):类似于死锁,活锁中的线程也没有进展,但区别在于,这些线程并没有阻塞,而是在不断地改变状态,试图进展。活锁通常发生在多个线程通过让步来避免冲突时,结果双方或多方不断重复尝试执行某操作却始终无法成功,造成了一种“忙等”状态。

状态表现:

死锁中的线程是静止的,它们保持等待状态,不会改变。

活锁中的线程是活动的,它们在不断改变自己的执行状态,但这种改变并不能帮助它们取得进展。

解开可能性:

死锁需要外部干预来解除,例如通过程序设计上的预防措施、使用死锁检测和恢复算法等。

活锁理论上有可能自行解开,例如通过引入随机的等待时间(退避策略)来打破循环尝试的同步,减少同时尝试的冲突。

资源占用与系统影响:

死锁中,线程虽然等待但不释放已占有的资源,可能导致资源浪费和系统服务不可用。

活锁中,线程虽然在活动,但因持续的无效尝试,可能会消耗大量的CPU资源,影响系统性能。

示例说明:

死锁示例:线程A锁住了资源1并等待资源2,同时线程B锁住了资源2并等待资源1,两线程都无法继续。

活锁示例:两个线程都想通过礼让来避免冲突,当一个线程发现另一个线程正在执行某操作时,就释放资源并重新尝试,但如果两者采用完全相同的策略,就会陷入无限的“你让我我让你”的循环中。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值