2016-07-29 4 views
1

Я не понимаю, журналы из следующего раздела кода: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 одну минуту позже.

Может кто-нибудь объяснить мне основные процессы, которые позволяют это произойти?

Наконец, аномалия в журнале (вверху) является последней строкой файла журнала. После этого нить, кажется, полностью висела.

+5

Что произошло в методе, который называется 'getInfoBox()'? Поскольку «Error» throwable не был бы захвачен этим обработчиком исключений и разбил бы поток. (Возможно, это был StackOverflowError или OutOfMemoryError) – Kiskae

+1

Один быстрый комментарий (и это, вероятно, не причина вашей проблемы), но вам, вероятно, следует переместить строки до и включить вызов 'lock.lock() над' try 'block - если по какой-либо причине вы выкидываете исключение, прежде чем вызывать' lock.lock() ', и ваш' finally'-блок пытается разблокировать его, вы добавите дополнительное 'IllegalMonitorStateException'. – CodeBlind

+0

@ Kiskae, спасибо. Я регистрирую JVM-память. Нет проблем с памятью (концерты в запас). Тем не менее, вы можете быть на что-то! Я рассмотрю мою обработку Исключения. – Jake

ответ

1

Из комментариев:

Как вы заявили, что не досмотрел все операторы в блоке try и не выполнить catch блок. Вероятно, это означает, что что-то было выброшено, что не было ошибкой Exception, например StackOverflowError, AssertionError или OutOfMemoryError. Если приложение не сработало и не было журналов, тогда Error, вероятно, молча проглотил где-то в приложении, что очень затруднит его отладку.

+0

Теперь я пытаюсь поймать (ошибка err) в конце каждого метода запуска Threads. Является ли это наиболее подходящим местом для захвата ошибок в многопоточном приложении? – Jake

+1

Вероятно, вы не должны ловить ошибки, так как они обычно не восстанавливаются. Регистрация неожиданных исключений должна выполняться методом 'Thread.setUncaughtExceptionHandler (...)'. Просто установите обработчик перед началом работы в потоке. – Kiskae

+0

gotcha ..... хотя я сделал повторную ошибку после регистрации ... забыл упомянуть – Jake