死锁、活锁、饥饿、无锁

it2025-08-31  9

死锁、活锁、饥饿、无锁针对线程或进程。以下以线程为例。

死锁: 线程相互等待锁释放。 举例: (1)A、B锁是独占锁。甲线程已获取A锁,想获取B锁后释放A锁;乙线程已获取B锁,想获取A锁后释放B锁。二者等待对方释放自己想获取的锁,自己却不释放对方想获取的锁,就会造成死锁,甲乙线程皆会一直阻塞。 预防: (1)有序资源分配算法:规定锁获取顺序,必须获取A锁后才能去获取B锁。 (2)银行家算法:独占锁不被占有时,才能去尝试获取。

活锁: 线程获取锁后不执行后续逻辑就释放锁。 举例: (1)甲线程获取锁后总会执行yield()让出CPU时间片。 预防: (1)先来先服务(公平锁):先获取锁的线程先执行。

饥饿: 一段时间内线程获取不到想操作的数据。 举例: (1)线程优先级低,线程执行概率小,一段时间内线程没有执行。 (2)A锁是独占锁。甲线程一段时间内一直占有A锁,导致B线程一段时间内无法获取A锁,导致无法继续执行。

无锁: 线程不加锁。 举例: (1)CAS(Compare And Swap,比较并替换)机制。线程不加锁,而是采用CAS方式修改数据。如果想修改数据的实际值是预期值,那么替换为目标值;如果不是,那么预期值改为实际值,根据新的预期值得到新的目标值,然后重新尝试修改;循环尝试至修改成功,或者因循环次数达到阈值而退出循环。

最新回复(0)