Возможно ли, что конкурирующий доступ к файлу вызовет тупик в Java? - PullRequest
2 голосов
/ 08 апреля 2010

Я гоняюсь за производственной ошибкой, которая достаточно прерывистая, чтобы быть настоящим бастичем для правильной диагностики, но достаточно частой, чтобы быть законной неприятностью для наших клиентов. Пока я жду, когда это снова произойдет на компьютере, настроенном на рассылку спама в лог-файле с выводом трассировки, я пытаюсь выдвинуть теорию о том, что это может быть.

Есть ли способ для конкурирующего чтения / записи файла, чтобы создать то, что равнозначно тупиковой ситуации? Например, допустим, у меня есть поток A, который иногда пишет в config.xml, и поток B, который иногда читает из него. Существует ли ряд обстоятельств, которые заставили бы поток B препятствовать продолжению потока A?

Заранее благодарю всех, кто помогает с этой теоретической рыбалкой.

Редактировать: Чтобы ответить на вопросы Pyrolistical: код не использует FileLock, а работает на компьютере WinXP. Не спрашивается, но, вероятно, стоит отметить: производственные машины работают под управлением Java 1.5.

Ответы [ 4 ]

2 голосов
/ 08 апреля 2010

Временно настройте производственный процесс на запуск с поддержкой отладки, добавьте это к тому, как вы запускаете вашу Java-программу, или к произнесению запуска tomcat:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

Затем прикрепите к нему:

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

И взгляните на свой стек (ы).

0 голосов
/ 11 сентября 2013

Я знаю, что это старый вариант, но для ясности ответа «Нет» (для тех из нас, кому необходимо знать, почему):

Блокировка происходит, когда чередуются ровно два разных процесса (транзакции)зависимые строки или записи, но в обратном порядке.В основном оба зависают, ожидая, пока другой завершит действие, которое никогда не произойдет (поскольку они оба ждут другого).Это обычно встречается в неправильном дизайне базы данных.

Если я помню, у Википедии есть хорошее определение здесь: http://en.wikipedia.org/wiki/Deadlock

Простой доступ к файлу не должен создавать такие зависимости.Более распространенная проблема - использование вашего ресурса другим процессом и недоступность тому, кто пытается получить к нему доступ.

0 голосов
/ 13 апреля 2010

Я получил несколько полезных советов по поиску основной ошибки, но на основании полученных ответов, мне кажется, правильный ответ на настоящий вопрос:

номер

Черт. Это было анти-климатическим.

0 голосов
/ 09 апреля 2010

FileLock - это механизм межпроцессной блокировки. Он ничего не делает в той же JVM, так что это не так. Я бы посмотрел на ваши синхронизации и, в частности, чтобы убедиться, что вы всегда получаете несколько блокировок в одном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...