Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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_File Io_Deadlock - Fatal编程技术网

在Java中,相互竞争的文件访问是否可能导致死锁?

在Java中,相互竞争的文件访问是否可能导致死锁?,java,file-io,deadlock,Java,File Io,Deadlock,我正在追踪一个生产缺陷,它是间歇性的,足以成为一个真正的巴斯蒂奇,能够正确地诊断,但频繁程度足以成为我们客户的合法麻烦。当我在等待它再次发生在一台设置为通过跟踪输出垃圾邮件发送日志文件的机器上时,我试图提出一个关于它可能是什么的理论 有没有办法让相互竞争的文件读/写操作造成死锁情况?例如,假设线程A偶尔写入config.xml,线程B偶尔从中读取。是否有一组情况会导致线程B阻止线程a继续进行 我首先要感谢任何帮助我进行这一理论捕鱼探险的人 编辑:回答Pyrolistical的问题:代码没有使用F

我正在追踪一个生产缺陷,它是间歇性的,足以成为一个真正的巴斯蒂奇,能够正确地诊断,但频繁程度足以成为我们客户的合法麻烦。当我在等待它再次发生在一台设置为通过跟踪输出垃圾邮件发送日志文件的机器上时,我试图提出一个关于它可能是什么的理论

有没有办法让相互竞争的文件读/写操作造成死锁情况?例如,假设线程A偶尔写入config.xml,线程B偶尔从中读取。是否有一组情况会导致线程B阻止线程a继续进行

我首先要感谢任何帮助我进行这一理论捕鱼探险的人


编辑:回答Pyrolistical的问题:代码没有使用FileLock,而是在WinXP机器上运行。未询问,但可能值得注意:生产机器正在运行Java 1.5。

临时设置生产过程以使用调试支持启动,将此添加到启动Java程序的方式中,或者说tomcat启动:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
然后附上:

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000

查看一下您的堆栈。

文件锁是一种进程间锁定机制。它在同一个JVM中什么都不做,所以不是这样。我会看看你的同步,特别是确保你总是以相同的顺序获得多个锁。

我得到了一些有用的技巧来追踪潜在的错误,但根据我得到的回答,似乎对实际问题的正确答案是:

没有


该死。这是反高潮的。

我知道这是老生常谈了,但要澄清“不”的答案(对于我们这些需要知道原因的人):

死锁发生在两个完全不同的进程(事务)更新交替的依赖行或记录时,但顺序相反。基本上,双方都挂起等待对方完成一个永远不会发生的动作(因为他们都在等待对方)。这通常存在于错误的数据库设计中

如果我记得的话,维基百科在这里有一个很好的定义:


简单文件访问不应该创建这样的依赖项。一个更常见的问题是,您的资源被另一个进程使用,而试图访问它的进程不可用。

您知道线程堆栈挂起时的样子吗?您可以使用jvisualvm连接到挂起的jvm并转储线程堆栈。是否使用
FileLock
?如果不是这样,我认为您将得到部分读取或错误,但决不会死锁。这也是OS和FSdependent@Devon:不,我没有。我不熟悉jvisualvm,但基于对谷歌的快速访问,这显然是我需要纠正的,谢谢@Pyrolistical:不,不使用FileLock,代码在WinXP下运行。您使用缓冲I/O还是非缓冲I/O?是什么让您如此确信是文件访问导致了死锁?您可以使用一个名为JConsole的工具来检测死锁,并找出哪些线程导致了死锁(以及它们的堆栈跟踪)。我相信它包含在JDK中。您也可以连接到live running应用程序,而无需更改启动参数。