这个是我们应该要避免出现的情况。
# !/usr/bin/python
# -*- coding:utf-8 -*-
# ++++++++++++++++++++
# author: FMspider
# time: 2018-5-3 11:35
# function: 死锁现象
import threading, time
class MyThread(threading.Thread):
def a(self):
lockA.acquire()
print(self.name, 'gotlockA', time.ctime())
time.sleep(3)
lockB.acquire()
print(self.name, 'gotlockB', time.ctime())
lockB.release()
lockA.release()
def b(self):
lockB.acquire()
print(self.name, 'gotlockB', time.ctime())
time.sleep(2)
lockA.acquire()
print(self.name, 'gotlockA', time.ctime())
lockA.release()
lockB.release()
def run(self):
self.a()
self.b()
if __name__ == '__main__':
lockA = threading.Lock()
lockB = threading.Lock()
threads = []
for i in range(5):
threads.append(MyThread())
for t in threads:
t.start()
for t in threads:
t.join() # 等待纯种结果。
运行结果:程序陷入死循环
解决方法:
# !/usr/bin/python
# -*- coding:utf-8 -*-
# ++++++++++++++++++++
# author: FMspider
# time: 2018-5-3 11:35
# function: 死锁现象
import threading, time
class MyThread(threading.Thread):
def a(self):
lock.acquire()
print(self.name, 'gotlockA', time.ctime())
time.sleep(3)
lock.acquire()
print(self.name, 'gotlockB', time.ctime())
lock.release()
lock.release()
def b(self):
lock.acquire()
print(self.name, 'gotlockB', time.ctime())
time.sleep(2)
lock.acquire()
print(self.name, 'gotlockA', time.ctime())
lock.release()
lock.release()
def run(self):
self.a()
self.b()
if __name__ == '__main__':
# lockA = threading.Lock()
# lockB = threading.Lock()
lock = threading.RLock()
threads = []
for i in range(5):
threads.append(MyThread())
for t in threads:
t.start()
for t in threads:
t.join() # 等待纯种结果。
运行结果: