我正在追逐一个间歇性的生产错误,这个错误足以成为一个真正的bastich,可以正确诊断但频繁到足以成为我们客户的合法滋扰。虽然我正在等待它再次发生在设置为使用跟踪输出来垃圾邮件日志文件的机器上,但我正试图找出它可能是什么的理论。
有没有办法竞争文件读/写以创建相当于死锁的条件?例如,假设我有一个偶尔会写入config.xml的线程A,以及偶尔会从中读取的线程B.是否存在一系列会导致线程B阻止线程A继续进行的情况?
我提前感谢任何帮助这次理论钓鱼活动的人。
编辑:回答Pyrolistical的问题:代码没有使用FileLock,并且正在WinXP机器上运行。没问,但可能值得注意:生产机器正在运行Java 1.5。
答案 0 :(得分:2)
暂时将您的生产过程设置为启动调试支持,将其添加到您启动Java程序的方式或者说tomcat启动:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
然后附上它:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000
看看你的筹码。
答案 1 :(得分:0)
FileLock是一个进程间锁定机制。它在同一个JVM中什么都不做,所以不是这样。我会查看你的同步,特别是确保你总是以相同的顺序获得多个锁。
答案 2 :(得分:0)
我已经获得了一些追逐底层错误的有用提示,但根据我得到的回复,似乎对实际问题的正确答案是:
没有
该死。那是反高潮的。
答案 3 :(得分:0)
我知道这已经过时了,但要在“否”答案上加以澄清(对于我们这些需要知道原因的人):
当两个不同的进程(事务)更新备用相关行或记录时,会发生死锁,但顺序相反。基本上两个人都在等待对方完成一个永远不会发生的动作(因为他们都在等待另一个)。这通常出现在错误的数据库设计中。
如果我记得,维基百科在这里有一个很好的定义:http://en.wikipedia.org/wiki/Deadlock
简单文件访问不应该像这样创建依赖项。一个更常见的问题是您的资源正被另一个进程使用,而对于尝试访问它的人来说则无法使用。