Я не понимаю, журналы из следующего раздела кода:Java: Поведение Автор указывает ReentrantLock поведение
private InfoBox getInfoBox(Path p)
{
try
{
String path = p.toString();
Log.getLogger().info("getting info box at " + path);
lock.lock();
Log.getLogger().info("got lock" + path);
JAXBContext jaxbContext = JAXBContext.newInstance(InfoBox.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
InfoBox ib = (InfoBox) jaxbUnmarshaller.unmarshal(p.toFile());
Log.getLogger().info("got info box");
return ib;
}
catch (Exception e)
{
Log.getLogger().error(e.getMessage(), e);
return null;
}
finally
{
lock.unlock();
Log.getLogger().info("released lock");
}
}
Когда все работает хорошо, запись журнала выглядит следующим образом:
[INFO] 2016-07-29 09: 58: 59,163: PersistenceThread.getInfoBox (PersistenceThread.java:618) PersistenceThread getInfoBox получает информационное поле в C: \ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml
[INFO] 2016-07-29 09: 58: 59179: PersistenceThread.getInfoBox (PersistenceThread.java:620) PersistenceThread getInfoBox получил lockC: \ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml
[INFO] 2016-07- 29 09: 58: 59203: информационное поле
[INFO] PersistenceThread.getInfoBox (PersistenceThread.java:627) PersistenceThread getInfoBox получил 2016-07-29 09: 58: 59207: PersistenceThread.getInfoBox (PersistenceThread.java:639) PersistenceThread getInfoBox выпустила замок
НО я га ве странная аномалия
[INFO] 2016-07-29 09: 59: 16079: PersistenceThread.getInfoBox (PersistenceThread.java:618) PersistenceThread getInfoBox получать информационное поле в C: \ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407 .xml
[INFO] 2016-07-29 09: 59: 16084: PersistenceThread.getInfoBox (PersistenceThread.java:620) PersistenceThread getInfoBox получил lockC: \ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml
[INFO] 2016-07-29 10: 01: 36,926: PersistenceThread.getInfoBox (PersistenceThread.java:639) Per sistenceThread getInfoBox выпустила замок
ПРИМЕЧАНИЕ Хотя замок приобретается, InfoBox НЕ извлекаться Исключение НЕ Метательное НО замок RELEASED одну минуту позже.
Может кто-нибудь объяснить мне основные процессы, которые позволяют это произойти?
Наконец, аномалия в журнале (вверху) является последней строкой файла журнала. После этого нить, кажется, полностью висела.
Что произошло в методе, который называется 'getInfoBox()'? Поскольку «Error» throwable не был бы захвачен этим обработчиком исключений и разбил бы поток. (Возможно, это был StackOverflowError или OutOfMemoryError) – Kiskae
Один быстрый комментарий (и это, вероятно, не причина вашей проблемы), но вам, вероятно, следует переместить строки до и включить вызов 'lock.lock() над' try 'block - если по какой-либо причине вы выкидываете исключение, прежде чем вызывать' lock.lock() ', и ваш' finally'-блок пытается разблокировать его, вы добавите дополнительное 'IllegalMonitorStateException'. – CodeBlind
@ Kiskae, спасибо. Я регистрирую JVM-память. Нет проблем с памятью (концерты в запас). Тем не менее, вы можете быть на что-то! Я рассмотрю мою обработку Исключения. – Jake