分享一个冷门bug

博主分享了在做远端调用框架阻塞启动时遇到的死锁问题。客户端和服务端分别获取通道输入流和输出流后出现死锁,将输入流和输出流的创建顺序与使用顺序保持一致可解决。追源码发现,按读写顺序设置流的读写顺序能保证正常通信。

好久不见,甚是想念,我是你们的好朋友祝英台炸油条。最近因为实习和毕业的事情忙的焦头烂额,没有去更新博文真的非常不好意思,这不咱今天就来了

更一个我遇到最新鲜的bug。如果没有去仔细玩io的朋友可能永远都遇不到!我敢保证🕶

今天在做远端调用框架阻塞启动的时候,客户端和服务端我分别获取了一个通道的输入流和输出流 然后启动后出问题了直接死锁动弹不得,我尝试去寻找原因,并修改,作为一个改bug专业户,当然“修改成功”,我就是把输入流和输出流的创建顺序和他们的使用顺序保持,一致就成功了?

可我不死心啊,继续查找原因,找到了个博客说的也倒是生动,我便按照他的方法追起了源码 (8条消息) ObjectInputStream与ObjectOutputStream的顺序问题_到中流遏飞舟的博客-优快云博客

不多说直接追源码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4cKNmdMf-1667113940608)(/upload/2022/04/image-0239095c0b0b496da6729d3b33dc885e.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4cj1ygka-1667113940610)(/upload/2022/04/image-9958f4a006364c0697eb37535b7d2ded.png)]

去看了下官方的解释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IV7v2TnT-1667113940612)(/upload/2022/04/image-137c4ae9416e49449f8b4bdefc276a3d.png)]

第一段的意思是,创建一个从指定的InputStream读取的ObjectInputStream,序列化的流的头是从这个Stream中读取并验证的。此构造方法会一直阻塞直到相应的ObjectOutputStream已经写入并刷新头。

所以上述代码执行后会都阻塞,如果将创建ObjectInputStream的顺序修改成其他的顺序,便可正常通信。

总之按照我的理解就是以自己的读写顺序来设置流的读写顺序,这样就保证没问题啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值