面试题答案
一键面试锁(Lock)机制解决资源竞争问题
在多线程编程中,当多个线程同时访问和修改共享资源时,会导致数据不一致等资源竞争问题。锁机制通过确保在同一时间只有一个线程可以访问共享资源,来解决这个问题。
共享变量读写操作示例代码
import threading
# 共享变量
shared_variable = 0
# 创建锁对象
lock = threading.Lock()
def increment():
global shared_variable
for _ in range(100000):
# 获取锁
lock.acquire()
try:
shared_variable += 1
finally:
# 释放锁
lock.release()
def decrement():
global shared_variable
for _ in range(100000):
lock.acquire()
try:
shared_variable -= 1
finally:
lock.release()
if __name__ == "__main__":
t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=decrement)
t1.start()
t2.start()
t1.join()
t2.join()
print(f"最终共享变量的值: {shared_variable}")
死锁产生的原因
死锁是指两个或多个线程相互等待对方释放锁,从而导致所有线程都无法继续执行的情况。通常发生在以下场景:
- 资源竞争:多个线程竞争多个资源,并且获取资源的顺序不一致。
- 循环依赖:线程A持有资源R1并等待资源R2,而线程B持有资源R2并等待资源R1,形成循环等待。
避免死锁的方法
- 按顺序获取锁:所有线程按照相同的顺序获取锁,避免循环依赖。
- 使用超时:在获取锁时设置超时时间,如果在规定时间内无法获取锁,则放弃并进行其他操作。
- 资源分配图算法:使用如银行家算法等资源分配算法,提前检测是否会发生死锁。
- 减少锁的持有时间:尽量缩短线程持有锁的时间,降低死锁发生的可能性。