Каждые несколько раз, когда я запускаю свое приложение на сервере разработки, оно кажется тупиковым. Я не уверен, что он также блокируется на рабочем сервере. Я приостанавливаю потоки и вижу, что один из них застрял в Permissions.implies: 162, который является началом блока synchronized
.
Мой код выполняет следующие действия: на домашней странице он отправляет 5 запросов jquery одновременно моему сервлету InitServlet
, который имеет метод service
synchronized
. Каждый раз с помощью метода обслуживания инициализируется другой компонент, каждому из которых требуется около 2 секунд для инициализации. Не имеет значения порядок, в котором потоки достигают метода обслуживания, и это происходит только 5 раз, во время запуска сервера, поэтому я думаю, что все в порядке для синхронизации метода службы.
Любые предложения о том, как исправить этот тупик, или кто-нибудь знает, если это просто ошибка с сервером разработки?
РЕДАКТИРОВАТЬ: выяснил, где происходит тупик, все еще не знаю, почему. Находясь внутри блокировки Permissions.implies, один поток вызывает Class.getDeclaredConstructors0 и никогда не возвращается из него. Другой поток ожидает получения блокировки в Permissions.implies. Первый поток, который зависает на getDeclaredConstructors0
, выполняет инициализацию класса для стандартного класса PersistenceManagerFactory, взятого из примеров документов GAE.