首页 > 编程笔记 > Java笔记 阅读:17

什么是线程活锁,和死锁有什么区别?(新手必看)

活锁是指两个或多个执行线程不断重复相同的操作,而这些操作又互相阻止彼此前进。就像两个人在走廊上相遇并试图避开对方,但是他们重复地向同一方向移动,导致他们都无法通过。

在存在活锁的情况下,线程没有被阻塞,它们处于活动状态,但是程序却没有进行任何实际的工作。活锁通常发生在处理事件时的错误设计上,当两个线程试图响应对方的操作时,它们可能会不断重复同一系列操作而无法执行后续逻辑。

例如,两个线程按照先到先服务的原则处理队列中的任务。如果它们面临相同优先级的任务并试图彼此礼让,就可能陷入活锁,即它们可能同时推迟自己的操作,导致系统任务停滞不前。

导致活锁产生的原因有以下几方面:
在系统中,我们可以采用以下策略减小活锁的发生概率,或在活锁发生时有效地将其解决:
死锁和活锁之间的区别有很多个方面,详情如下表所示:

特性 死锁 活锁
基本定义 当某个线程持有某些资源同时等待其他资源,而它等待的资源被其他线程占有时会产生死锁。如果没有外部干预,这些线程处于阻塞状态 活锁是指两个或多个执行线程无限制地重复相同的操作,而这些操作又互相阻止彼此前进
线程状态 线程处于阻塞状态,没有任何进展 线程处于运行状态
资源使用 线程不释放已占用的资源,其他线程会阻塞请求的资源 线程虽然占用资源,但它们尝试通过改变状态来解决问题
解决策略 死锁通常需要外部干预来解决,比如中断或杀死线程 活锁可能通过线程间的变化自行解决,如某个线程改变它的行为
系统表现 死锁的系统是静止的,涉及的线程或进程不执行任何操作 活锁的系统看起来很忙碌,但无实际进展

相关文章