重新理了一遍麻烦老师把我的分析看完,感谢了!

重新理了一遍麻烦老师把我的分析看完,感谢了!

我重新整理一下这个问题老师,有点长,麻烦您详细看下,麻烦老师多花一分钟来看,一定拜托老师看完。


首先进行打断点调试,在获取序号最小的子节点这里打上断点

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


此时进来两个线程exex-1 exec-2 

由于是两个线程,那么肯定会在zk上创建两个数据节点000 和 0001

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


我们看这两个线程获取的子节点信息

exec-1,此时它只查询到了一个节点000,原因是它先到断点这里

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


再看exec-2,它查询到两个节点,原因就是它后到,它自己有添加了一个临时节点,所以查出来两个也就是线程1的000和自己创建的001

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


好了,老师这里是关键,我让exec-1这个线程先执行,由于该线程查询来的节点只有一个且与自己的序列号相等,那么它直接获取到锁然后return true,跳出try的时候关闭连接然后删除000节点,000节点被删除了哈!!!!!!!!!!!


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


如果你不相信被删除,我们看zk,只有001了


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


紧接着放开exec-2线程,由于它里面有两个child节点 000(已经被exec-1删除了) 以及0001

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


按照逻辑找到000,然后给它设置监听器,删除了的节点设置监听器是无效的,此时返回的是null !!!!,既然都无效了(节点早就被exec-1删除了)谁去触发这个事件?很明显这个监听器没设置成功嘛,就算设置成功也没有线程再去删除000,它早就被删除了嘛


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


接下来按照逻辑进入wait

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


永远wait,程序不会说谎

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






正在回答

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

1回答

你翻翻之前的问题吧,有人提过这样的问题。

这里wait方法加个超时时间吧

  • Panda_io 提问者 #1

    嘿嘿嘿,谢谢老师,之前那个人也是我,只是我觉得我没描述详细,就再描述一次

    2021-03-03 10:03:47
  • 凌波微步 回复 提问者 Panda_io #2

    我知道是你,半年以前吧,也有人提这个问题,还有一些其他问题,你可以翻翻看看。

    2021-03-03 13:43:19
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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