Эта блокировка предназначена для предотвращения одновременной записи нескольких потоков в один и тот же OutputStream, поскольку это может привести к смешению данных. Хотя это не гарантируется, многие реализации OutputStream в любом случае блокируют вызовы на запись - поэтому даже если бы блокировка была снята, она просто заблокировалась бы в реализации OutputStream.
Очевидно, это происходит потому, что используемый OutputStream записывает данные из какого-то другого потока. Этот поток не указывает, что кольцевой буфер заполнен, но возможно, что какой-то другой поток заблокирован из-за этого. Мне не ясно, почему вы должны писать в консоль, но Вход в облако предоставляет больше данных о том, почему вы не должны этого делать и какие альтернативы у вас есть при работе в облачной среде.
Обновление : После просмотра полного дампа потока у меня есть некоторые наблюдения:
- Есть много потоков, ожидающих в
com.xxxx.apie.library.InternalRequest.execute(InternalRequest.java:273)
. Похоже, они ожидают выполнения работы в другом потоке, но из дампа потока неясно, что именно. - Есть несколько потоков, записывающихся в выходной поток, которые заблокированы. Вызовы исходят из разных точек в паре классов, но все они регистрируются на информационном уровне.
- Вы используете JsonLayout.
- Вы не разместили свою конфигурацию Log4j, но в трассировке стека выше вы можете видеть, что AsyncLoggerConfig вызывает метод журнала LoggerConfig. При просмотре кода в AsyncLogger может показаться, что вы настроили AsyncLogger, у которого нет ссылок на приложение, поэтому регистратор делегирует свои полномочия своему родителю, который НЕ является асинхронным регистратором, поэтому событие журнала даже не помещается в очередь в кольцевой буфер, а регистрируется непосредственно из потока приложения.
Суть в том, что вы ведете журнал синхронно в OutputStream (возможно, в консоль), и потоки блокируют это, потому что ввод-вывод медленный.