Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程程序挂起访问地图_Java_Multithreading - Fatal编程技术网

Java多线程程序挂起访问地图

Java多线程程序挂起访问地图,java,multithreading,Java,Multithreading,我有一个多线程程序,运行一段时间后会挂起。终止后的堆栈显示每个线程都挂在concurrentMap的get方法上。 我想知道是什么导致了这个问题? 我想知道: 1:使用concurrentMap时是否可能出现死锁?我只做简单的get/put。。。。 2:基本上是什么导致多线程程序挂起?有没有可能这个糟糕的程序只是内存不足? 谢谢大家! 谢谢大家的帮助。为了使问题具体化: 每个辅助线程都处于以下挂起状态: 分类器0“prio=10 tid=0x00007fda04420800 nid=0x16a2

我有一个多线程程序,运行一段时间后会挂起。终止后的堆栈显示每个线程都挂在concurrentMap的get方法上。 我想知道是什么导致了这个问题? 我想知道: 1:使用concurrentMap时是否可能出现死锁?我只做简单的get/put。。。。 2:基本上是什么导致多线程程序挂起?有没有可能这个糟糕的程序只是内存不足? 谢谢大家!

谢谢大家的帮助。为了使问题具体化:

每个辅助线程都处于以下挂起状态:

分类器0“prio=10 tid=0x00007fda04420800 nid=0x16a2可运行[0x00000000414ea000] java.lang.Thread.State:可运行 在java.util.concurrent.ConcurrentHashMap.get()处

和程序片段:

    for (String feature : features) {
        Integer ti = this.descMap_.get(feature);
        if (ti == null) {
            ti = this.featureCount_.incrementAndGet();
            this.descMap_.put(feature, ti);
            this.featureMap_.put(ti, feature);
        }

        ans.add(new Entry<Integer, Value>(ti, tval));
    }
for(字符串特征:特征){
整数ti=this.descMap_u2;.get(特征);
如果(ti==null){
ti=this.featureCount_uu2;.incrementAndGet();
此.descMap.put(特征,ti);
此.featureMap_uu.put(ti,feature);
}
ans.add(新条目(ti、tval));
}
featureCount_uu是一个原子整数


应该是非常简单的代码….

这取决于您使用的是哪种类型的
ConcurrentMap
,但一般来说,这些结构可以是活锁的。也就是说,试图进行修改的线程会花费所有时间来决定谁先进行修改,而从不着手进行更改

我猜您的意思是您实际上使用的是
ConcurrentHashMap
。在这种情况下,请确保设置正确(它应该与并发修改的线程数非常接近,错误率较高)


在另一条调查路径上,您是否使用JRockit?它的“优化”“可能会在不应该发生死锁的地方导致死锁。

这取决于您使用的是哪种类型的
ConcurrentMap
,但一般来说,这些结构可能会死锁。”。也就是说,试图进行修改的线程会花费所有的时间来决定谁先进行修改,而从不进行修改

我猜您的意思是您实际上正在使用
ConcurrentHashMap
。在这种情况下,请确保设置正确(它应该与并发修改的线程数量非常接近,错误率较高)



在另一种调查途径上,您是否使用JRockit?它的“优化”可能会在不应该出现死锁的地方导致死锁。

如果您在退出时发布代码和堆栈跟踪(挂起的进程),这会有所帮助。ConccurentHashMap.get永远不会阻塞(理论上是Java 6),因此不应该出现死锁。它卡在哪一行上?如果内存不足,应该抛出内存不足异常,而不是挂起。@Jay bwei将无法控制该异常。JVM会抛出OOM错误。@B我假设您使用的是标准JDK,而不是OpenJDK?除非更改hashcode字段或内存不足,否则CHM.get没有理由进入活锁。您看到发生这种情况时内存是否已达到最大值了吗?如果您在退出时发布代码和堆栈跟踪(挂起进程),这会有所帮助。ConccurentHashMap.get将永远不会阻塞(理论上使用Java 6),因此不会出现死锁。它卡在哪一行上?如果内存不足,应该抛出内存不足异常,而不是挂起。@Jay bwei将无法控制该异常。JVM会抛出OOM错误。@B我假设您使用的是标准JDK,而不是OpenJDK?除非更改hashcode字段或内存不足,否则CHM.get没有理由进入活锁。你看到发生这种情况时内存是否达到最大值了吗?我正在使用ConcurrentHashMap。非常感谢。我会试着设定一个标准concurrencyLevel@bwei-有多少线程正在修改映射?默认并发级别为16.en,16应该足够了。在测试阶段,我们只使用4-5个线程。@bwei-好的,听起来不是问题所在。我将查看您的代码。@B抱歉,我也没有发现代码有任何错误。我正在使用ConcurrentHashMap。非常感谢。我会试着设定一个标准concurrencyLevel@bwei-有多少线程正在修改映射?默认并发级别为16.en,16应该足够了。在测试阶段,我们只使用4-5个线程。@bwei-好的,听起来不是问题所在。我将查看您的代码。@B抱歉,我也没有发现代码有任何错误。