死锁与Socket超时

死锁:资源互相竞争,相互拿着对方需要的锁,造成无法和解,程序僵死。

Socket超时,Socket连接未设置有效超时时间,连接、读取超时。

问题:
之前碰到过类似的,但是居然忘记了。昨天碰到的,再次记录一下。

现象:
在我处理的这个特殊场景下,可以理解为是个单线程的业务场景。需要进行下载文件,结果昨天晚上程序假死,下载文件没成功。第一时间怀疑死锁,因为做了改动,开了事务。
进行jstat -l pid >xxx.log。

分析之后未发现死锁,该运行的运行,但是发现一个内容很长的运行中的线程,这么特殊,仔细研究下,内容如下:

"scheduling-1" #18 prio=5 os_prio=0 tid=0x00007f7574752000 nid=0xca4 runnable [0x00007f7544f49000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
	at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
	at sun.security.ssl.InputRecord.read(InputRecord.java:532)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:990)
	- locked <0x00000000fb0db3f0> (a java.lang.Object)
	at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:948)
	at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
	- locked <0x00000000fb0f28d0> (a sun.security.ssl.AppInputStream)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
	- locked <0x00000000fb0f28e8> (a java.io.BufferedInputStream)
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)

就是这个,一直跟踪下来,发现这个一直在运行,在等待读,我这个是使用第三方提供的jar包,里面
HttpURLConnection 没有设置连接和读取超时时间,这个connection 底层是socket协议,会进行阻塞,造成假死现象。

解决办法,设置连接和读取超时时间

上一次改了两个请求方法,以为其他地方没用到。结果还是踩了个坑。
有人说过一次故障后面是90次轻微故障,和10次隐患,这是真的。上次应该把这个第三方jar包所有的方法都改了,但是我只是改了两个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值