在多线程同步使用的时候存在数据的不安全问题,python解释器在底层添加了GIL全局解释器锁机制来控制锁的安全问题,但不是绝对的安全。在日常的开发中还需要开发者添加锁机制在代码中。
多线程锁用到的是Lock和RLock模块
from threading import Thread, Lock
import time
class Mythread(Thread):
def __init__(self):
super().__init__()
def run(self):
if lockA.acquire():
# 如果可以获取到锁,返回的是True,这是一个bool类型的
print(self.name + '获取了A锁')
# time.sleep(0.1)
if lockB.acquire():
print(self.name + '又获取了B锁,原来还有A锁')
lockB.release()
lockA.release()
class Mythread1(Thread):
def __init__(self):
super().__init__()
def run(self):
if lockB.acquire():
# 如果可以获取到锁,返回的是True,这是一个bool类型的
print(self.name + '获取了B锁')
# time.sleep(0.1)
if lockA.acquire():
print(self.name + '又获取了A锁,原来还有B锁')
lockA.release()
lockB.release()
if __name__ == '__main__':
lockA = Lock()
lockB = Lock()
m = Mythread()
m.start()
m1 = Mythread1()
m1.start()
from threading import Thread, Lock
import time
class Mythread(Thread):
def __init__(self):
super().__init__()
def run(self):
if lockA.acquire():
# 如果可以获取到锁,返回的是True,这是一个bool类型的
print(self.name + '获取了A锁')
# time.sleep(0.1)
if lockB.acquire(timeout=5):
# 设定等待时间,超出时间释放锁,解决死锁的问题
print(self.name + '又获取了B锁,原来还有A锁')
lockB.release()
lockA.release()
class Mythread1(Thread):
def __init__(self):
super().__init__()
def run(self):
if lockB.acquire():
# 如果可以获取到锁,返回的是True,这是一个bool类型的
print(self.name + '获取了B锁')
# time.sleep(0.1)
if lockA.acquire():
print(self.name + '又获取了A锁,原来还有B锁')
lockA.release()
lockB.release()
if __name__ == '__main__':
lockA = Lock()
lockB = Lock()
m = Mythread()
m.start()
m1 = Mythread1()
m1.start()
线程之间出现死锁的问题本质在于资源分配顺序上的问题。
原文:https://www.cnblogs.com/ddzc/p/12462888.html