重新理了一遍麻烦老师把我的分析看完,感谢了!
我重新整理一下这个问题老师,有点长,麻烦您详细看下,麻烦老师多花一分钟来看,一定拜托老师看完。
首先进行打断点调试,在获取序号最小的子节点这里打上断点

此时进来两个线程exex-1 exec-2
由于是两个线程,那么肯定会在zk上创建两个数据节点000 和 0001

我们看这两个线程获取的子节点信息
exec-1,此时它只查询到了一个节点000,原因是它先到断点这里

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

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

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

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

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

接下来按照逻辑进入wait

永远wait,程序不会说谎

正在回答
你翻翻之前的问题吧,有人提过这样的问题。
这里wait方法加个超时时间吧
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星