使用JNDI库执行DNS查询时线程挂起

时间:2016-07-11 11:26:01

标签: 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.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.security.SecureRandom.next的速度慢。

下面是遇到类似死锁的jdk bug https://bugs.openjdk.java.net/browse/JDK-8066209

有人可以告诉我这种情况发生的原因吗?如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我看到同样的问题,我相信我已经解决了。问题似乎是SecureRandom.nextBytes读取/dev/random。但是,如果/dev/random熵池中没有留下足够的熵,则读取将阻止。有关可能的解决方案,请参阅the Oracle docs有关此问题,this excellent article有关SecureRandom的选项,this bug有关设置Java选项以使用/dev/./urandom而不是看似等效的/dev/urandom }