在Python的多线程编程中,为避免多个线程同时访问同一个共享资源而发生冲突,需要使用同步机制来确保线程安全,其中Lock就是一个同步机制。
Lock是一个互斥锁,当线程获取了锁,其他线程就不能再获取该锁,直到该线程释放了锁。
在Python中可以通过threading模块的Lock类来实现锁的功能。
Lock类有两个主要方法:acquire()和release()。
- 当线程需要访问共享资源时,它会调用acquire()方法来获取锁,如果该锁已经被其他线程获取,该线程就会被阻塞,直到锁被释放。
- 当线程访问完共享资源后,它会调用release()方法来释放锁。
以下是一个使用Lock的示例代码:
import threading
class Counter:
def __init__(self):
self.value = 0
self.lock = threading.Lock()
def increment(self):
self.lock.acquire() # 获取锁
try:
self.value += 1
finally:
self.lock.release() # 释放锁
counter = Counter()
def worker():
for i in range(100):
counter.increment()
threads = []
for i in range(10):# 创建了10个线程来执行worker()函数,最后输出counter.value的值 10*100 = 1000
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
print(counter.value) # 期望值1000
在上面的示例中:
Counter类表示一个计数器,它有一个成员变量value和一个Lock对象lock。
increment()方法是一个线程安全的方法,它使用了Lock来确保同时只有一个线程可以访问value变量。
worker()方法是一个简单的线程函数,它会调用increment()方法100次。
在主程序中,创建了10个线程来执行worker()函数,最后输出counter.value的值,期望输出1000。