RFR: JDK-6823527: java.util.logging.Handler has thread safety issues
Daniel Fuchs
daniel.fuchs at oracle.com
Thu Aug 29 18:04:49 UTC 2013
On 8/29/13 7:58 PM, Mandy Chung wrote:
> On 8/29/13 9:46 AM, Daniel Fuchs wrote:
>> Here is the new webrev implementing Jason's suggestion.
>> Compared to previous webrev only Handler.java & StreamHandler.java
>> have changed.
>>
>> <http://cr.openjdk.java.net/~dfuchs/webrev_6823527/webrev.01/>
>>
>
> Looks good. I also agree that making those fields to be volatile is a
> good suggestion and only requires writer to acquire the lock.
>
> A minor comment: The setter methods in Handler class are synchronized
> at the method entry whereas StreamHandler.setPushLevel synchronizes
> after checkPermission() is called. checkPermission doesn't need to be
> synchronized. Either way is fine with me and it'd be good to do it
> consistently.
Hi Mandy,
Are you suggesting I should put checkPermission() within
the synchronized block? It might be more consistent with
what the other setters do. Although as you state it does
not matter much.
(its' MemoryHandler - not StreamHandler BTW)
best regards,
-- daniel
>
> Mandy
>
>> best regards,
>>
>> -- daniel
>>
>>
>>>
>>> -- daniel
>>>
>>> On 8/29/13 5:29 PM, Jason Mehrens wrote:
>>>> > Yes - this is a possibility I envisaged too.
>>>> > But would that be better?
>>>> >
>>>> > I didn't want to remove any synchronized blocks because I'm
>>>> > really not sure of what consequences it might have.
>>>> > getLevel()/setLevel() are already synchronized on Handler.
>>>> > It is my belief that most operation already need to call
>>>> > getLevel(). So synchronizing on getFilter/setFilter etc.
>>>> > should not be such a big issue.
>>>> The only reason that I can think of for synchronizing any of the
>>>> j.u.Handler methods is that the code was created prior to the JMM
>>>> revision of volatile in JDK 1.5. The lock policy is required for the 3
>>>> abstract methods so that a single LogRecord is published all or
>>>> nothing. The level, filter, error manager, encoding could all be
>>>> declared volatile with no locking. For the subclasses the locking for
>>>> publish is too coarse. The isLoggable method should be called outside
>>>> the lock.
>>>>
>>>> > Also - synchronizing on 'this' has the advantage that the lock
>>>> > can be shared with subclasses - I mean - that's what a
>>>> > subclass would usually expect...
>>>> The same was true for COWList
>>>> (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6282140) but, the
>>>> lock policy changed over time. This is bug is about thread safety
>>>> issues so subclass should have little expectations.
>>>>
>>>>
>>>> > But if I hear strong opinions that 'volatile' is definitely better
>>>> > for this case I'm prepared to alter my patch.
>>>> > I personally tend to use 'volatile' only sparsely - when it's clear
>>>> > that it's the better solution.
>>>> The common case is that Handler.getFoo are a hot methods and
>>>> Handler.setFoo are cold. You could always declare the level, filter,
>>>> error manager, and encoding volatile and have only the setFoo methods
>>>> synchronize when setting the property.
>>>> Jason
>>>
>>
>
More information about the core-libs-dev
mailing list