RFR: JDK-6823527: java.util.logging.Handler has thread safety issues

Daniel Fuchs daniel.fuchs at oracle.com
Thu Aug 29 13:08:45 UTC 2013


On 8/29/13 2:14 PM, Jason Mehrens wrote:
> Hi Daniel,
>
> Why not take the code the opposite direction and change everything to
> volatile?  The properties of handler are mostly read and rarely
> written.  If isLoggable, getLevel, and getFilter were lock free
> the LogRecords that are not loggable could barge past the publish
> method.  That way you would only block threads that are actually
> publishing information of interest.
>
> Jason

Hi Jason,

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.

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...

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.

best regards,

-- daniel

>
>  > Date: Thu, 29 Aug 2013 21:33:07 +1000
>  > From: david.holmes at oracle.com
>  > To: daniel.fuchs at oracle.com
>  > Subject: Re: RFR: JDK-6823527: java.util.logging.Handler has thread
> safety issues
>  > CC: core-libs-dev at openjdk.java.net
>  >
>  > Hi Daniel,
>  >
>  > On the surface these changes seem reasonable - the code looks the way it
>  > should have been written in the first place.
>  >
>  > The risk with these kinds of changes are always performance and
>  > deadlocks. :) I would not be surprised, given this is logging, that
>  > somewhere there is a path that might lead to a deadlock - but I have no
>  > practical way to ascertain that.
>  >
>  > Wait for a true core-libs Reviewer before pushing this one. :)
>  >
>  > David
>  >
>  > On 29/08/2013 8:42 PM, Daniel Fuchs wrote:
>  > > Hi,
>  > >
>  > > This is a fix for an old bug which rightfully remarks that
>  > > whereas access to 'level' in handler is synchronized,
>  > > access to other mutable fields - like 'filter' etc...
>  > > is not - which is inconsistent.
>  > >
>  > > <http://cr.openjdk.java.net/~dfuchs/webrev_6823527/webrev.00/>
>  > >
>  > > I have tried to keep the fix simple - simply adding
>  > > synchronized to method declarations when it was clear that
>  > > there was an inconsistency.
>  > >
>  > > I also looked at the subclasses of j.u.l.Handler
>  > >
>  > > In some places I resorted to using a synchronized block to avoid
>  > > calling overridable / external method from within the lock.
>  > >
>  > > The changed methods are simple accessors, and subclasses of
>  > > Handler are already full of synchronized methods (e.g.
>  > > methods like publish(...) are already synchronized)
>  > > so the risk of fixing these simple accessors should be limited.
>  > >
>  > > best regards,
>  > >
>  > > -- daniel




More information about the core-libs-dev mailing list