- 死锁和活锁的区别
基本定义:
死锁(Deadlock):指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的状态。每个线程至少持有一个资源,并等待另一个由其他线程持有的资源,形成了一个等待环路,没有外部干预(如系统中断或特殊处理),这些线程将永远阻塞。
活锁(Livelock):类似于死锁,活锁中的线程也没有进展,但区别在于,这些线程并没有阻塞,而是在不断地改变状态,试图进展。活锁通常发生在多个线程通过让步来避免冲突时,结果双方或多方不断重复尝试执行某操作却始终无法成功,造成了一种“忙等”状态。
状态表现:
死锁中的线程是静止的,它们保持等待状态,不会改变。
活锁中的线程是活动的,它们在不断改变自己的执行状态,但这种改变并不能帮助它们取得进展。
解开可能性:
死锁需要外部干预来解除,例如通过程序设计上的预防措施、使用死锁检测和恢复算法等。
活锁理论上有可能自行解开,例如通过引入随机的等待时间(退避策略)来打破循环尝试的同步,减少同时尝试的冲突。
资源占用与系统影响:
死锁中,线程虽然等待但不释放已占有的资源,可能导致资源浪费和系统服务不可用。
活锁中,线程虽然在活动,但因持续的无效尝试,可能会消耗大量的CPU资源,影响系统性能。
示例说明:
死锁示例:线程A锁住了资源1并等待资源2,同时线程B锁住了资源2并等待资源1,两线程都无法继续。
活锁示例:两个线程都想通过礼让来避免冲突,当一个线程发现另一个线程正在执行某操作时,就释放资源并重新尝试,但如果两者采用完全相同的策略,就会陷入无限的“你让我我让你”的循环中。
如果大家需要视频版本的讲解,欢迎关注我的B站: