Java 线程在使用JNDI库执行DNS查询时挂起
下面是从DNS获取TXT记录时线程被锁定导致的死锁Java 线程在使用JNDI库执行DNS查询时挂起,java,multithreading,dns,java-7,jdk1.7,Java,Multithreading,Dns,Java 7,Jdk1.7,下面是从DNS获取TXT记录时线程被锁定导致的死锁 java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(FileInputStream.java:272) at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.jav
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:202)
at sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:264)
at sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:278)
- locked <0x00000004f3cd17b0> (a java.lang.Object)
at sun.security.provider.NativePRNG$RandomIO.access$200(NativePRNG.java:125)
at sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:114)
at java.security.SecureRandom.nextBytes(SecureRandom.java:466)
- locked <0x00000004f111d290> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:488)
at java.util.Random.nextInt(Random.java:303)
at com.sun.jndi.dns.DnsClient.query(DnsClient.java:175)
at com.sun.jndi.dns.Resolver.query(Resolver.java:81)
at com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:430)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:231)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:139)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:127)
at javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:142)
java.lang.Thread.State:可运行
位于java.io.FileInputStream.readBytes(本机方法)
在java.io.FileInputStream.read(FileInputStream.java:272)处
位于sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:202)
在sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:264)上
位于sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:278)
-锁定(一个java.lang.Object)
位于sun.security.provider.NativePRNG$RandomIO.access$200(NativePRNG.java:125)
位于sun.security.provider.NativePRNG.enginextbytes(NativePRNG.java:114)
位于java.security.SecureRandom.nextBytes(SecureRandom.java:466)
-锁定(一个java.security.SecureRandom)
下一步(SecureRandom.java:488)
位于java.util.Random.nextInt(Random.java:303)
位于com.sun.jndi.dns.DnsClient.query(DnsClient.java:175)
位于com.sun.jndi.dns.Resolver.query(Resolver.java:81)
位于com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:430)
位于com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:231)
位于com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:139)
位于com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:127)
位于javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:142)
通过分析,我发现这个线程锁是由于执行java.security.SecureRandom.next的速度缓慢造成的
下面是针对遇到的类似死锁提交的jdk错误
有人能告诉我发生这种情况的原因以及如何解决这个问题吗?我看到了同样的问题,我相信我已经解决了。问题似乎是
SecureRandom.nextBytes
读取/dev/random
。但是,如果/dev/random
熵池中没有足够的熵,读取将被阻止。有关可能的解决方案,请参阅关于该问题、关于SecureRandom的选项以及关于将Java选项设置为使用/dev//uradom
,而不是看似等效的/dev/uradom
。我也看到了,但没有解决办法或原因。我可以告诉你,在我的情况下,这与DNS无关,而是我直接使用SecureRandom。