首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么log4j-slf4j-impl不是锁自由的?

为什么log4j-slf4j-impl不是锁自由的?
EN

Stack Overflow用户
提问于 2019-11-12 20:57:06
回答 1查看 299关注 0票数 0

我在我们的应用程序中使用Async log4j2而不是slf4j,我确信这是非阻塞的。但是在集成了BlockHound之后,我得到了一个惊喜:

代码语言:javascript
复制
java.lang.Exception: [worker-1-8] Blocking call: sun.misc.Unsafe#park
 at reactor.blockhound.BlockHound$Builder.lambda$install$6(BlockHound.java:318)
 at reactor.blockhound.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:46)
 at sun.misc.Unsafe.park(Unsafe.java)
 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
 at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
 at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
 at com.lmax.disruptor.TimeoutBlockingWaitStrategy.signalAllWhenBlocking(TimeoutBlockingWaitStrategy.java:62)
 at com.lmax.disruptor.MultiProducerSequencer.publish(MultiProducerSequencer.java:218)
 at com.lmax.disruptor.RingBuffer.translateAndPublish(RingBuffer.java:990)
 at com.lmax.disruptor.RingBuffer.tryPublishEvent(RingBuffer.java:538)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor.tryEnqueue(AsyncLoggerConfigDisruptor.java:392)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfig.logToAsyncDelegate(AsyncLoggerConfig.java:135)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfig.log(AsyncLoggerConfig.java:116)
 at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
 at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
 at org.apache.logging.log4j.core.Logger.log(Logger.java:162)
 at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2190)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2144)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2127)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2020)
 at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1891)
 at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:184)

这是意料之中的行为,还是我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2019-11-19 19:05:32

Log4j2的异步日志记录只是通过中断器(一种环形缓冲区)将I/O部分传递给单独的线程。生产者使用Java语言内置的notify()向消费者发出信号,它必须获取一个锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58819259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档