【发布时间】:2009-12-01 08:31:16
【问题描述】:
由于某种原因,输出如下:
public void msgNeedParts() {
// Blabla...
System.out.println(name + ": Try to print 'tasks'...");
synchronized(tasks) {
System.out.println(name + ": Tasks--" + tasks);
System.out.println(name + ": Did I manage to print it?");
tasks.add(new BinToDump(feeder, binNum));
}
stateChanged();
}
只打印出“GantryAgent: Try to print 'tasks'...”,但不会打印以下任何消息。我猜测线程在尝试访问同步列表“任务”时会以某种方式“卡住”,但我不知道为什么会这样。
'tasks' 是这样声明和初始化的:
private List<BinToDump> tasks =
Collections.synchronizedList(new ArrayList<BinToDump>());
谁能指出我遗漏了什么?
啊!我怀疑我可能有罪魁祸首:
/* If nothing left to do, return to original position. */
synchronized (tasks) {
if (tasks.isEmpty()) {
doReturnToOriginalPos();
}
}
在我的调度程序(这是一个代理设计)中,我检查“任务”是否为空,然后调用 doReturnToOriginalPos()。也许这只是一次又一次地发生得太快以至于其他方法没有机会修改它?
这确实是问题所在!它在我的调度程序中一直被调用得如此之快,以至于没有其他东西可以访问“任务”。感谢大家的帮助!
【问题讨论】:
-
发布所有访问“任务”集合的代码。您在某个地方锁定了对它的访问权限,或者出现了死锁。
-
除了声明/初始化之外,我发布的代码应该是第一次访问“任务”,但我会努力发布其余部分。
标签: java synchronized