面试题答案
一键面试可能遇到的资源竞争问题
- 共享数据访问冲突:例如多个线程同时读取和修改图书排名数据(如一个全局的图书排名列表),可能导致数据不一致。比如线程A读取了排名第1的图书信息,准备进行一些计算后更新排名,但在它更新前,线程B也读取了同样的排名数据并进行了更新,这时线程A再更新就会覆盖线程B的更新,造成数据丢失。
- 文件I/O冲突:如果需要将图书排名结果写入文件,多个线程同时写入可能导致文件内容混乱,例如一个线程写入一部分内容,另一个线程紧接着写入,导致文件内容格式错误。
使用锁机制解决问题
在Python中,可以使用threading.Lock
来解决资源竞争问题。
示例代码如下:
import threading
# 模拟图书排名数据
book_rankings = [{"title": "Book1", "rank": 1}, {"title": "Book2", "rank": 2}]
lock = threading.Lock()
def update_rank(book_title, new_rank):
global book_rankings
lock.acquire()
try:
for book in book_rankings:
if book["title"] == book_title:
book["rank"] = new_rank
break
finally:
lock.release()
# 创建并启动线程
thread1 = threading.Thread(target=update_rank, args=("Book1", 3))
thread2 = threading.Thread(target=update_rank, args=("Book2", 4))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(book_rankings)
在上述代码中,lock.acquire()
获取锁,确保只有一个线程可以进入临界区(修改book_rankings
的部分),lock.release()
释放锁,这样就避免了多个线程同时修改book_rankings
造成的数据不一致问题。
对于文件I/O冲突,也可以类似地在文件写入操作前后加锁:
import threading
lock = threading.Lock()
def write_to_file(content):
lock.acquire()
try:
with open('rankings.txt', 'a') as file:
file.write(content + '\n')
finally:
lock.release()
# 创建并启动线程
thread3 = threading.Thread(target=write_to_file, args=("Book1 - Rank 3",))
thread4 = threading.Thread(target=write_to_file, args=("Book2 - Rank 4",))
thread3.start()
thread4.start()
thread3.join()
thread4.join()
这里在文件写入操作前后加锁,保证了多个线程写入文件时不会出现内容混乱的情况。