Deadlock between FileHandler and ConsoleHandler when using customized formatter

Shi Jun Zhang zhangshj at linux.vnet.ibm.com
Tue Dec 10 07:15:30 UTC 2013


On 12/9/2013 8:04 PM, Peter Levart wrote:
> On 12/09/2013 10:50 AM, Shi Jun Zhang wrote:
>> On 12/9/2013 4:40 PM, Peter Levart wrote:
>>> On 12/09/2013 09:28 AM, Peter Levart wrote:
>>>> On 12/09/2013 08:02 AM, Shi Jun Zhang wrote:
>>>>> Peter,
>>>>>
>>>>> I think you are misunderstanding this problem. This deadlock is 
>>>>> not related to the formatter synchronization, we can make 
>>>>> CustomerFormatter.format not synchronized and not call 
>>>>> super.format, the deadlock still happens.
>>>>
>>>> I'm not saying that your formatters are explicitly synchronized - 
>>>> all formatters are currently effectively synchronized by 
>>>> LogHandlers. The Formatter is invoked from within LogHandler's 
>>>> publish() method which is synchronized (on LogHandler.this). If 
>>>> formatters were invoked out of this synchronized section, there 
>>>> would be no danger of deadlocks when using Logger.log from within 
>>>> custom formatters. But then other issues would arise as a 
>>>> consequence of non-multithreaded formatters being invoked 
>>>> concurrently...
>>>>
>>>> Regards, Peter
>>>>
>>>
>>> I think the best solution to your problem (or a work-around if you 
>>> say so) was suggested by Jason Mehrens few messages ago - decoupling 
>>> of user code from publishing of log records - by creating an 
>>> AsyncLogHandler that is just feeding a FIFO queue with log records 
>>> which are processed by a background thread by pop-ing them out of 
>>> queue and sticking them in the actual LogHandler.publish(). If the 
>>> queue is unbouded or large enough so that it never fills up, there's 
>>> no danger of dead-locks even if you invoke Logger.log from custom 
>>> formatters in such background publishing thread.
>>>
>>> Regards, Peter
>>>
>> Hi Peter,
>>
>> Would the following situation happen if we use AsyncLogHandler? Some 
>> error happens and it causes the jvm crashes or System.exit() is 
>> called, however the related log record which contains important 
>> message is still in the queue and not printed. If so, I think it's 
>> unacceptable.
>>
>
> You could install a shutdown-hook that would make sure the remaining 
> queue is flushed before completing the VM exit...
>
> Regards, Peter
>
But shutdown hook will not be executed if VM crashes or exit abnormally.

-- 
Regards,

Shi Jun Zhang




More information about the core-libs-dev mailing list