zk的锁出现并发问题

zk的锁出现并发问题

老师我觉得zkLock您这里实现还是有些问题

我启一个应用,用浏览器两个窗口发送请求模拟多线程

spring 程序采用多线程debug


首先我让两个线程都来到创建完成临时节点这里


第一个线程,创建的znode是003

http://img1.sycdn.imooc.com//climg/603de580098558bf09220205.jpg


第二个线程,创建的node是004

http://img1.sycdn.imooc.com//climg/603de5b50933bd4e09870209.jpg

zk上的数据分布

http://img1.sycdn.imooc.com//climg/603de5db093be84005980063.jpg


此时我让第一个线程先执行完成,session关闭,003数据节点被删除

http://img1.sycdn.imooc.com//climg/603de63609763e4b06560066.jpg


但是此时第二个线程已经获取了003这个过时数据,尝试着给它加锁,没报任何异常,直接进入wait,这个wait已经没有事件去调用该zkLock这个object的notify()方法了,将一直处于waiting状态,没有任何线程去唤醒它。

http://img1.sycdn.imooc.com//climg/603de72809773d8807230094.jpg


老师,您看下是不是这样呢?






正在回答

登陆购买课程后可参与讨论,去登陆

1回答

节点删除,会触发zk的监听器,在监听的删除事件中,会触发notifyall。

  • Panda_io 提问者 #1

    老师我第一个线程线程执行完成后,这个节点(003)已经被删除了,此时还没有任何线程给这个节点(003)加watcher,但是第二个线程已经获取到了这个节点的名字(003),还没来得及给它(003)加watcher,第一个线程因为运行结束调用unlock方法删除了该节点(003),然后第二个线程再给这个被删除的节点(003)加锁,由于它已经被删除,所以无法再次触发删除这个节点的事件了呢

    2021-03-02 16:39:23
  • Panda_io 提问者 #2

    最后一句是加事件不是加锁,打错了

    2021-03-02 16:40:16
  • 凌波微步 回复 提问者 Panda_io #3

    简单的处理办法是,wait()方法加个超时时间。

    2021-03-03 09:05:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师