面试题答案
一键面试Condition
实现线程同步原理
- 内部机制:
Condition
对象内部维护了一个锁(通常是RLock
或Lock
),用于保护共享资源。它允许线程在满足特定条件时等待,在条件满足时通知其他等待的线程。 - 等待机制:当一个线程调用
Condition
的wait()
方法时,它会释放内部锁并进入等待状态。此时,该线程会被放入等待队列中,暂停执行。 - 通知机制:其他线程可以调用
Condition
的notify()
或notify_all()
方法。notify()
会唤醒等待队列中的一个线程,而notify_all()
会唤醒等待队列中的所有线程。被唤醒的线程会重新获取内部锁,然后继续执行。
Event
实现线程同步原理
- 内部标志:
Event
对象内部有一个标志位,初始值为False
。 - 等待机制:线程调用
Event
的wait()
方法时,如果标志位为False
,线程会阻塞等待;如果标志位为True
,线程会立即继续执行。 - 设置机制:其他线程可以调用
Event
的set()
方法将标志位设置为True
,从而唤醒所有等待的线程。调用clear()
方法可以将标志位重置为False
。
利用这些机制优化程序性能并避免死锁
- 优化性能
- 减少竞争:使用
Condition
时,只有在必要时才让线程等待,避免不必要的线程阻塞和唤醒开销。例如,在生产者 - 消费者模型中,只有当缓冲区满时生产者线程才等待,当缓冲区空时消费者线程才等待。 - 合理通知:在使用
Condition
的notify()
或notify_all()
时,要确保通知的线程是真正需要执行的。如果过度使用notify_all()
可能会唤醒一些不必要的线程,增加系统开销。对于Event
,可以根据程序逻辑及时设置或清除标志位,使线程能够快速响应所需的操作。
- 减少竞争:使用
- 避免死锁
- 锁顺序一致:在使用
Condition
时,确保所有线程获取锁和等待/通知的顺序一致。如果多个线程以不同顺序获取锁,可能会导致死锁。 - 避免嵌套锁:尽量避免在持有一个锁的情况下尝试获取另一个锁,特别是当不同线程获取锁的顺序不一致时。
- 超时机制:在使用
Condition
的wait()
方法时,可以设置超时时间。如果线程在指定时间内没有被唤醒,可以采取其他措施,避免无限期等待。对于Event
,如果等待时间过长,也可以考虑放弃等待并进行相应处理。
- 锁顺序一致:在使用