面试题答案
一键面试活锁常见场景
- 资源分配场景:多个进程或线程都在尝试获取资源,但由于资源分配策略不当,例如每个进程都在获取部分资源后又释放并重新尝试获取全部资源,导致它们一直在重复相同的获取 - 释放动作,却始终无法获取到足够资源继续执行。
- 消息传递场景:在分布式系统或进程间通信中,两个或多个进程相互等待对方发送的消息来执行下一步操作。如果它们都在等待对方先发送消息,并且每次检测到对方未发送消息时就立即重试发送自己的消息,就会陷入活锁,不断尝试但无进展。
避免活锁策略 - 引入随机延迟
- 原理:通过在重试操作中引入随机延迟,打破进程或线程之间的对称性,使得它们不会一直重复相同的操作序列。随机延迟可以让不同的进程或线程在不同的时间点重试,从而有机会打破循环等待状态,让某个进程能够获取到所需资源继续执行。
- 实现方式: 以Python的多线程示例来说明,假设我们有两个线程竞争资源,代码如下:
import threading
import time
import random
class Resource:
def __init__(self):
self.lock = threading.Lock()
resource = Resource()
def thread_function(name):
while True:
if resource.lock.acquire(timeout=1):
try:
print(f"{name} acquired the resource.")
# 模拟使用资源
time.sleep(1)
break
finally:
resource.lock.release()
else:
# 引入随机延迟
delay = random.uniform(0, 1)
print(f"{name} did not acquire the resource. Retrying in {delay} seconds.")
time.sleep(delay)
if __name__ == "__main__":
t1 = threading.Thread(target=thread_function, args=("Thread 1",))
t2 = threading.Thread(target=thread_function, args=("Thread 2",))
t1.start()
t2.start()
t1.join()
t2.join()
在上述代码中,当线程未能获取到锁时,会随机等待0到1秒的时间后再重试,通过这种方式减少活锁发生的可能性。