死锁一定会造成cpu使用率飙升吗?

这取决于锁的实现,通常锁有两种实现:

ps: 在一个角落看到这篇文章,记录一下;

1 拿不到锁的时候,忙等待,反复探测锁状态,直到拿到锁,进入临界区。这种情况会消耗CPU。

1
while (locked);

这种锁,称为自旋锁。比如pthread_spin_lock。

2 拿不到锁的时候,放弃CPU,休眠,离开运行队列,这种情况不会消耗CPU。

1
while (locked) sleep(1);

这种锁,称为休眠锁。pthread_mutex就是这种锁。也是最常用的锁。

当然通常不会直接使用sleep实现,因为sleep会导致释放锁后,等锁的线程不能及时醒来干活儿。一般会借助系统调用,比如linux上会使用futex,这个调用可以让等锁线程休眠直到被释放锁的线程唤醒它。等锁线程会执行FUTEX_WAIT休眠, 而unlock的线程会执行FUTEX_WAKE唤醒休眠的等锁线程。

1
if (locked) futex(FUTEX_WAIT...);

so,由于自旋锁不会放弃CPU,没有调度开销(进出运行队列),性能要好于休眠锁,只是等锁的时候CPU是100%,所以适用于临界区比较短的场景。

facebook的folly库,实现了一种混合的锁,先自旋一定的次数,然后执行sleep放弃cpu。可以避免异常情况下,持锁进程长时间不释放导致的CPU开销问题。
java的synchronized也是一种混合锁(jdk1.6引入锁升级后),所以死锁也不会造成cpu飙升的问题。