java回调函数死锁_死锁,互斥锁,递归锁,线程事件Event,线程队列Queue,进程池和线程池,回调函数,协程的使用,协程的例子---day33...

#### 死锁 互斥锁 递归锁

from threading import Lock,Thread,RLock #递归锁

importtime

noddle_lock=Lock()

kuaizi_lock=Lock()defeat1(name):

noodle_lock.acquire()#上锁

print("%s拿到面条了" %(name))

kuaizi_lock.acquire()#上锁

print("%s拿到筷子了"%(name))print("开始享受这碗面条...")

time.sleep(0.5)

kuaizi_lock.acquire()#解锁

print("%s放下裤子了"%(name))

noddle_lock.release()print("%s放下面条了"%(name))defeat2(name):

kuaizi_lock.acquire()print("%s拿到筷子了"%(name))

noddle_lock.acquire()print("%s拿到面条了"%(name))print("开始享受这碗面条了...")

time.sleep(0.5)

noddle_lock.release()print("%s放下面条了"%(name))

kuaizi_lock.release()print("%s放下筷子了"%(name))if __name__ == '__main__':

name_lst1= ['王振','小白']

name_lst2= ['刘伟','小林']for name inname_lst1:

Thread(target=eat1,args=(name,)).start()for name inname_lst2:

Thread(target=eat2,args=(name,)).start()#上面的代码就是死锁

#(2) 递归锁 解决线上bug 上锁和解锁要保持一对,递归锁连续上锁连续解锁也不会变成死锁,而互斥锁就不可以

'''作用:

递归锁专门用来解决死锁现象

是临时用于快速解决项目因死锁问题不能正常运行的场景

用来处理异常死锁的

rlock =RLock() #创建一个对象 上锁后再上一把锁,然后再解锁,不会变成死锁

lock = Lock() #互斥锁没遇到release就会变成死锁,即使你上锁后又上了一把锁,然后再解锁,也是死锁

def func():

#lock上锁后下面必须跟解锁,下面的代码是阻塞状态,只上锁不解锁 死锁

lock.acquire() #下面两把锁是同一个对象,一个对象连续上锁就会造成死锁

lock.acquire()

print(333)

lock.release()

lock.release()

#下面代码正常执行

rlock.acquire()

rlock.acquire()

print(111)

rlock.release()

rlock.release()

print(222)

func()'''

#(3) 用递归锁解决死锁

noodle_lock =Lock()

kuaizi_lock=Lock()

noodle_lock.acquire()#这两把锁是不同对象,所有不会造成死锁,上面代码造成死锁是同一个对象

kuaizi_lock.acquire()print(1)

noodle_lock.release()

kuaizi_lock.release()print(2)#递归锁解决死锁

noodle_lock = kuaiz_lock = RLock() #是一把递归锁

defeat1(name):

noodle_lock.acquire()#上锁

print("%s拿到面条了"%(name))

kuaizi_lock.acquire()#上锁

print("%s拿到筷子了"%s(name))print("开始享受这碗面条...")

time.sleep(0.5)

kuaizi_lock.release()#解锁

print("%s放下筷子了"%(name))

noodle_lock.release()print("%s放下面条了"%(name))defeat2(name):

kuaizi_lock.acquire()print("%s拿到筷子了"%(name))

noodle_lock.acquire()#上锁

print("%s拿到面条了"%(name))print("开始享受这碗面条...")

time.sleep(0.5)

noodle_lock.release()print("%s放下面条了"%(namne))

kuaizi_lock.release()#解锁

print("%s放下筷子了"%(name))if __name__ == '__main__':

name_lst1= ["王振","小白"]

name_lst2= ["刘伟","小林"]for name inname_lst1:

Thread(target=eat1,args=(name,)).start()for name inname_lst2:

Thread(target=eat2,args=(name,)).start()#(4) 互斥锁 让拿筷子和吃面条绑定成一个整体,#尽量使用一把锁解决问题,不要互相嵌套,否则容易死锁

mylock =Lock()defeat1(name):

mylock.acquire()#上锁

print("%s拿到面条了"%(name))print("%s拿到筷子了"%(name))print("开始享受这碗面条...")

time.sleep(0.5)print("%s放下筷子了"%(name))print("%s放下面条了"%(name))

mylock.release()#解锁

defeat2(name):

mylock.acquire()#上锁

print("%s拿到筷子了"%(name))print("%s拿到面条了"%(name))print("开始享受这碗面条...")

time.sleep(0.5)print("%s放下面条了"%(name))print("%s放下筷子了"%(name))

mylock.release()if __name__ == '__main__':

name_lst1= ["王振","小白"]

name_lst2= ["刘伟","小林"]for name inname_lst1:

Thread(target=eat1,args=(name,)).start()for name inname_lst2:

Thread(target=eat2,args=(name,)).start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值