面试题答案
一键面试- 使用
threading.Lock
实现线程安全的描述:threading.Lock
是一种简单的锁机制。当一个线程获取到锁(通过lock.acquire()
方法),其他线程就无法获取,直到该线程释放锁(通过lock.release()
方法)。这样在获取锁和释放锁之间的代码块就成为了临界区,同一时间只有一个线程能执行临界区内的代码,从而确保了多线程环境下数据的一致性。
- 示例代码:
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()
# 创建线程
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=decrement)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
print(f"最终共享变量的值: {shared_variable}")
在上述代码中,increment
和decrement
函数都对shared_variable
进行操作,通过lock
确保在同一时间只有一个线程能修改这个共享变量,从而保证了结果的正确性。即使两个线程同时尝试操作shared_variable
,由于锁的存在,也不会出现数据竞争问题。最终打印出的shared_variable
值应该为0。