面试题答案
一键面试互斥锁(Mutex)
- 适用场景:适用于多线程访问共享资源,当资源访问时间较长、线程竞争不激烈的情况。例如对数据库的读写操作,操作过程相对耗时,使用互斥锁可以保证同一时间只有一个线程能访问数据库,避免数据冲突。
自旋锁(Spin Lock)
- 适用场景:适合于锁的持有时间非常短、线程竞争激烈且CPU资源不紧张的场景。比如在多核CPU环境下,一个线程只是短暂地持有锁来完成一些简单的计算任务,其他线程在等待锁时通过自旋(不断尝试获取锁)而不是进入睡眠状态,减少线程上下文切换的开销。
递归锁(Recursive Lock)
- 适用场景:当一个线程可能多次获取同一把锁的情况下使用,例如在递归函数中。如果使用普通互斥锁,递归调用时会导致死锁,而递归锁允许同一线程多次获取锁,每次获取锁时锁的计数加1,每次释放锁时计数减1,当计数为0时锁真正被释放。
信号量(Semaphore)
- 适用场景:可用于控制对有限资源的访问。比如一个服务器同时只能处理10个并发请求,就可以使用信号量来限制并发访问的线程数量为10,当有超过10个线程尝试访问时,多余的线程会等待,直到有线程释放信号量。
读写锁(Read-Write Lock)
- 适用场景:适用于读多写少的场景。允许多个线程同时进行读操作,因为读操作不会修改共享资源,不会产生数据冲突;但只允许一个线程进行写操作,并且在写操作时不允许读操作,以保证数据的一致性。例如一个缓存系统,大量线程可能同时读取缓存数据,但只有少数线程会更新缓存,此时读写锁就能有效提高性能。