面试题答案
一键面试自旋锁
- 应用场景:适用于锁的持有时间非常短且CPU资源不紧张的场景。例如多核CPU环境下,线程在访问共享资源时,若预计等待锁的时间极短,可使用自旋锁。比如在多核处理器的缓存一致性协议实现中,当一个核心访问共享缓存行时,其他核心可能短时间等待,此时自旋锁较为合适。
- 原因:自旋锁不会使线程进入睡眠状态,而是在等待锁的过程中持续尝试获取锁。如果等待时间短,这种方式避免了线程上下文切换带来的开销,提高了效率。但如果等待时间长,自旋会浪费CPU资源。
互斥锁
- 应用场景:常用于线程竞争资源较激烈,且锁的持有时间相对较长的场景。比如在文件系统中,多个线程对文件进行读写操作时,为防止数据不一致,使用互斥锁来保证同一时间只有一个线程能访问文件。
- 原因:互斥锁采用的是让等待锁的线程进入睡眠状态的方式。当锁被占用时,其他线程会睡眠,这样避免了长时间自旋浪费CPU资源。当竞争激烈或持有锁时间长时,线程上下文切换的开销相比自旋浪费的资源是可接受的,能更好地平衡系统资源使用。
信号量
- 应用场景:适用于控制并发访问的资源数量场景。如数据库连接池,假设连接池最大连接数为10,就可以用信号量来控制同时获取连接的线程数量不超过10个。
- 原因:信号量可以允许多个线程同时访问共享资源,只要未超过设定的资源数量上限。通过信号量的计数器机制,能方便地实现对并发访问数量的控制,确保系统资源不会被过度占用。