一.介绍threading模块中的Lock类,Lock类中包含的方法:
1.acquire(blocking=True,timeout=-1)
方法的含义:以阻塞或非阻塞的状态获取一个锁
自己的理解:
1.blocking=True,timeout=-1
马上就能获得锁,获得不了就一直等着,直到锁被别的线程释放
2.blocking = True,timeout = 2
允许它等2s,等了2s也获得不了锁,那就不去获得锁了,继续接下来的代码
3.blocking = False
,当blocking=False
的时候,不能传入timeout
参数。即不允许它等一会,马上就去获得锁,无法获得,那就不要这个锁了,继续接下来的代码
二.
blocking=True,timeout=-1
代码:
线程1acquire了锁,因为Lock不支持可重入,所以线程2一直在等待中。线程1打印完“我是被1上锁的”之后又重新去acquire锁。但是Lock对象不支持可重入。因为此时Lock对象已经为上锁状态,所以线程1也要继续等待。线程1和线程2同时无限等待。导致程序阻塞,不能向下进行。
blocking = True,timeout = 2
线程1先acquire了锁,然后time.sleep(4),然后又将锁释放了。线程2等了2s然后,没有获得锁,就继续执行接下来的代码了,运行到lock1.release()的时候,因为锁已经被线程1释放了,所以线程2去释放锁会报错
blocking = False
同上