[我被自己坑出翔]socketRead0 Block进程

事实证明,我的确是一个挖坑好手!挖得一手好坑,坑得一手好人!可惜每每别人没坑着,总是坑了自己。灰头土脸之余,来回首一下今天这个陨石洞!
小弟最近在用java Socket开发一个通信传输小应用,在满怀激情挥洒汗水一阵乱码之后,很不幸果然不出小弟所料,这个应用不work啊。不仅该传的东西没传,Server上处理本次通信的线程还被Block住了。事已至此啥也不说了,赶紧撸起袖管子~看Dump呗。一看Dump,线程被block在一个叫socketRead0的方法上~啥?socketRead0,?谁TM命名这么不规范!定睛一瞧,这是一个native方法,我伙呆~小弟这个navie小弱码渣居然在有生之年能被native方法坑到,坑得值啊!想到这里,小弟心里不禁油油然起来鸟!
那到底为啥子小弟会被这个native方法block到呢~经过认真仔细的考证学习,是因为socketWrite0方法会把数据写到Tcp buffer里等着对方来读,如果这个buffer被写满了,却没有被读,这样的话socketWrite0就闷声block线程(如果你设置了一个非常长的timeout)~
于是乎,真相只有一个!就是小弟的程序里必然有一个地方把这个buffer写满了没有被读啊!果不其然,原因就是这样,至于小弟在程序里的什么地方,用什么方式坑到了自己,就不细说了,人艰不拆啊!!!

PS.这个错误还常见于log4j的SocketAppender上~大家要小心呦,不要因为一句log就block了整个线程呦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值