直接回答:抢锁失败时,自旋锁让线程在原地循环忙等(烧 CPU 但不放弃 CPU),互斥锁让线程睡眠、让出 CPU 进入阻塞队列,等锁释放后被唤醒。两者核心区别是等待策略:忙等 vs 睡眠。

展开解析:场景选择看等待成本与上下文切换成本的对比。自旋锁省掉了两次上下文切换(睡眠+唤醒),适合临界区极短、持锁时间可预期的场合,典型如内核中保护短小的数据结构、以及不能睡眠的中断上下文(此时互斥锁根本无法使用);缺点是单核上自旋毫无意义(持锁者跑不了,纯浪费),故内核单核配置下自旋锁退化为关抢占。互斥锁适合临界区较长或可能阻塞(如持锁期间做 IO)的用户态场景。工程实践常用折中:先自旋一小段时间再睡眠(自适应互斥锁,如 Java 的偏向锁/轻量级锁思路、pthread 的 adaptive mutex)。追问方向:单核为何自旋无意义、抢占式内核中自旋锁与关中断的关系。