面试题答案
一键面试1. 竞争条件(Race Condition)场景
- 场景举例:多个线程同时访问和修改共享变量,比如银行账户余额。假设有两个线程,一个线程执行存款操作,另一个线程执行取款操作,都对账户余额这一共享变量进行读写。
- 原因:由于线程执行顺序的不确定性,当多个线程同时读写共享资源时,可能导致最终结果与预期不符。例如,在读取账户余额后、修改余额之前,另一个线程也读取了相同的余额,这样后续的修改就会覆盖之前的操作,造成数据不一致。
2. 死锁场景
- 场景举例:两个线程,线程A持有资源1并等待获取资源2,而线程B持有资源2并等待获取资源1,双方都不愿意释放自己已持有的资源,从而陷入死循环。比如在数据库事务中,事务A锁住表1并尝试锁住表2,事务B锁住表2并尝试锁住表1。
- 原因:死锁的产生需要同时满足四个条件:互斥条件(资源一次只能被一个线程使用)、占有并等待条件(线程持有部分资源并等待其他资源)、不可剥夺条件(资源只能由持有线程主动释放)、循环等待条件(存在一个线程循环等待链)。当这些条件同时满足时,就会出现死锁。
3. 资源共享场景(未正确同步)
- 场景举例:多个线程同时向一个共享的文件中写入数据。例如,一个日志记录系统,多个线程都可能记录日志到同一个日志文件中。
- 原因:如果没有合适的同步机制,多个线程同时写入可能会导致数据混乱,一部分线程写入的数据可能覆盖其他线程正在写入的数据,破坏文件内容的完整性。因为文件是共享资源,多个线程并发访问时缺乏有效的协调。