1.存在着资源竞争,那么就会存在着恶意竞争,当线程之间为了统一资源进行了恶意竞争时,就有可能产生死锁状态。
2.在多线程中,面对同一个全局变量资源,会采用互斥锁来解决线程有可能会对资源做出修改的问题,从而保证了代码的完整性和准确性,但是互斥锁并不是唯一的,示例如下:
#coding=utf-8
import threading
import time
class MyThread1(threading.Thread):
def run(self):
# 对mutexA上锁
mutexA.acquire()
# mutexA上锁后,延时1秒,等待另外那个线程 把mutexB上锁
print(self.name+'----do1---up----')
time.sleep(1)
# 此时会堵塞,因为这个mutexB已经被另外的线程抢先上锁了
mutexB.acquire()
print(self.name+'----do1---down----')
mutexB.release()
# 对mutexA解锁
mutexA.release()
class MyThread2(threading.Thread):
def run(self):
# 对mutexB上锁
mutexB.acquire()
# mutexB上锁后,延时1秒,等待另外那个线程 把mutexA上锁
print(self.name+'----do2---up----')
time.sleep(1)
# 此时会堵塞,因为这个mutexA已经被另外的线程抢先上锁了
mutexA.acquire()
print(self.name+'----do2---down----')
mutexA.release()
# 对mutexB解锁
mutexB.release()
mutexA = threading.Lock()
mutexB = threading.Lock()
if __name__ == '__main__':
t1 = MyThread1()
t2 = MyThread2()
t1.start()
t2.start()
当存在着多个资源时,线程A对部分资源上了锁,并且等待着其余资源,才能够打开锁,释放部分资源;同时,线程B对其余资源上锁,同时等待着部分资源,才能够释放其余资源,双方僵持,都不肯先进行释放,于是导致了死锁的产生。
3.如何避免死锁问题的产生呢?
- 程序设计时要尽量避免(银行家算法)
- 添加超时时间等