【发布时间】:2010-07-13 08:19:04
【问题描述】:
我正在开发工具,它采用 Java 代码并生成代码,以估计基本块、循环和方法的执行时间。在执行了某个块之后,我们就可以使用我们的工具了。程序模型存储在下一个表示中
static Hashtable<String, Hashtable<Integer, Hashtable<String, pair>>> method2Data = new Hashtable<String, Hashtable<Integer, Hashtable<String, pair>>>();
static Hashtable<String, Vector<String>> class2Method = new Hashtable<String, Vector<String>>();
一个方法所花费的时间
public static void addBlock(int id, double time, String meth, String thread);
但我还有下一个问题。在每次调用 addBlock 时,我们都会从 method2data 中获取一些东西。因为我们可以有像
这样的代码for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++) {
addBlock(0,...);
addBlock(m,...);
}
我们经常调用 addBlock。 不幸的是,在我们的 claster 上工作了一段时间后,程序就停止了工作。它看起来仍然像进程,但不占用任何 CPU。我发现,如果我删除从 method2data 中获取某些内容的代码,那么一切正常。所以,我猜,对 Hashtable 的访问存在一些问题。有什么好的想法吗?
多亏了大家,看来我在并发访问的情况下遇到了死锁,并且在没有并发访问的情况下可能会耗尽内存。
【问题讨论】:
-
可以同时调用 addBlock 吗?如果是,是否有一些锁或同步块?
-
是的,他们可以,但我记得 Hashtable 允许并发访问。