线程锁
- 主要用来给方法、代码块加锁。
- 当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。
- 当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对象中的非加锁代码块的。
- 多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!为避免错误,使用线程锁。
- 进程锁 :也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。
- 分布式锁 :当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁。
- 同:作用都是一样的,只是作用的范围大小不同。
- 异:范围大小:分布式锁 > 进程锁 > 线程锁。能用线程锁,进程锁情况下,也可用分布式锁。能用线程锁的情况下,也可用进程锁。只是范围越大技术复杂度就越大。
#创建锁
lock = threading.Lock()
#锁定
lock.acquire([timeout])
#释放
lock.release()
6. 优缺点
- 优点:保证资源同步
- 缺点:比较慢
完整代码:
import threading,time
ticket = 10
# 创建一把锁
lock = threading.Lock()
def sell_ticket():
global ticket
while True:
lock.acquire()
if ticket>0:
time.sleep(1)
ticket -= 1
lock.release()
print('{}卖出1张票,还剩{}张'.format(threading.current_thread().name,ticket))
else:
lock.release()
print('票卖完啦')
break
t1 = threading.Thread(target=sell_ticket,name='线程1')
t2 = threading.Thread(target=sell_ticket,name='线程2')
t1.start()
t2.start()
运行结果:
线程1卖出1张票,还剩9张 线程1卖出1张票,还剩8张 线程2卖出1张票,还剩7张 线程1卖出1张票,还剩6张 线程2卖出1张票,还剩5张 线程1卖出1张票,还剩4张 线程2卖出1张票,还剩3张 线程2卖出1张票,还剩2张 线程2卖出1张票,还剩1张 线程1卖出1张票,还剩0张 票卖完啦票卖完啦
- 补充:关于多线程,可查阅小主上一篇文章嘿:Python:多线程介绍https://blog.csdn.net/weixin_44015669/article/details/109360115