面试题答案
一键面试区别
- 互斥锁:
- 本质是一种特殊的二元信号量(取值只有0和1),用于保证在同一时刻只有一个线程能够访问临界区。它主要用于线程对共享资源的排他性访问,同一时间只允许一个线程持有锁进入临界区,其他线程必须等待锁的释放。
- 一般用于控制对临界资源的独占访问,确保线程安全。例如,当多个线程同时访问一个共享文件进行写入操作时,为防止数据混乱,就可以使用互斥锁保证每次只有一个线程能进行写入。
- 信号量:
- 信号量可以有一个大于1的初始值,表示可用资源的数量。线程获取信号量时,信号量的值减1;释放信号量时,信号量的值加1。当信号量的值为0时,其他线程获取信号量就会被阻塞。
- 它更侧重于控制对有限资源的访问数量,适用于多个线程竞争有限数量资源的场景。
优先选择信号量的场景
例如,在一个数据库连接池的场景中,连接池有固定数量(如10个)的数据库连接可供多个线程使用。每个线程在需要进行数据库操作时,需要获取一个数据库连接。如果使用互斥锁,每次只能有一个线程使用数据库连接,这会导致连接资源利用率低下。而使用信号量,将信号量初始值设为10,代表有10个可用的数据库连接资源。每个线程获取信号量时(即获取一个连接),信号量值减1,当10个连接都被占用时,信号量值为0,其他线程就需要等待,直到有线程释放连接(释放信号量),这样就能有效地控制同时使用数据库连接的线程数量,提高资源利用率。所以在这种有固定数量资源可供多个线程使用的场景下,优先选择信号量而非互斥锁。