Yes, overriding a synchronized method with an unsynchronized method sounds dangerous... Warnings would probably be helpful.
On Wed, Apr 30, 2014 at 11:13 PM, Gary Gregory <garydgreg...@gmail.com>wrote: > I'm pretty sure Eclipse does that. > > Gary > > > On Wed, Apr 30, 2014 at 9:50 AM, Matt Sicker <boa...@gmail.com> wrote: > >> So it's a good idea to set up your IDE to warn if you override a >> synchronized method with an unsynchronized method? I remember seeing that >> one somewhere. >> >> >> On 30 April 2014 00:35, Remko Popma <remko.po...@gmail.com> wrote: >> >>> Agreed that unless the synchronization is part of the public API it is >>> better to lock on an internal object (e.g. private Object lock = new >>> Object(); ). >>> >>> On the other hand, OutputStreamManager and subclasses have some >>> synchronized public/protected methods and in this case the synchronization >>> on "this" is part of the public API. >>> >>> >>> >>> On Wed, Apr 30, 2014 at 1:24 PM, Matt Sicker <boa...@gmail.com> wrote: >>> >>>> If you want more than one condition monitor, it's also better to use >>>> Lock. I'll definitely agree on the simplicity of synchronizing on an >>>> internal Object instance, though. Locking on this, however, is generally a >>>> bad idea because any other code can synchronize on the object as well by >>>> accident and cause weird problems. >>>> >>>> >>>> On 29 April 2014 20:51, Gary Gregory <garydgreg...@gmail.com> wrote: >>>> >>>>> I like the KISS approach for now as well. >>>>> >>>>> Gary >>>>> >>>>> >>>>> On Tue, Apr 29, 2014 at 9:45 PM, Remko Popma <remko.po...@gmail.com>wrote: >>>>> >>>>>> This should be a separate thread, but anyway... >>>>>> >>>>>> I would oppose using fair locks. Not only will throughput be much >>>>>> less, the benefits are debatable, since fairness of locks does not >>>>>> guarantee fairness of thread scheduling. So we would always pay a >>>>>> price in throughput without any guarantee of upside on the latency >>>>>> variance. Not a good trade-off. >>>>>> >>>>>> The solution here is not using different locking mechanisms but not >>>>>> using locking at all. That is, anyone who is concerned about latency >>>>>> variance (of which starvation is an extreme case) should be using >>>>>> asynchronous loggers. The numbers show that with the disruptor (Async >>>>>> Loggers) you get 3 to 5 *orders of magnitude* less latency. (Yes that >>>>>> means >>>>>> 1000x - 100,000x less latency.) And this is compared to AsyncAppender. >>>>>> Synchronous logging is not even in the picture here. >>>>>> >>>>>> I do agree that synchronizing on a String should be avoided, because >>>>>> Strings can be intern()-ed (and in the ConfigurationFactory case it was a >>>>>> String literal which is intern()ed by default), which means that our lock >>>>>> object is globally visible and other parts of the system could >>>>>> potentially >>>>>> synchronize on it and cause deadlock. That was a nice catch. >>>>>> >>>>>> However, I'm not convinced that java.util.concurrent.Lock is always >>>>>> better than the synchronized keyword. It is a more powerful API, and >>>>>> gives >>>>>> more low-level control, but it comes with more complexity and >>>>>> responsibility, the most obvious one being you need to manually unlock() >>>>>> it. With the synchronized keyword I don't need to worry if I or anyone >>>>>> refactoring the code still correctly unlock()s the lock in a finally >>>>>> clause. It just works. Nice and simple. It is only when I really need the >>>>>> more powerful API that I consider using Locks. For example when using >>>>>> separate read and write locks. Or if I need to use tryLock(). Things >>>>>> that I >>>>>> can't do with the synchronized keyword. Otherwise I prefer to keep it >>>>>> simple. >>>>>> >>>>>> My 2 cents. >>>>>> >>>>>> Remko >>>>>> >>>>>> >>>>>> On Wed, Apr 30, 2014 at 5:45 AM, Matt Sicker <boa...@gmail.com>wrote: >>>>>> >>>>>>> Should we be using a fair lock? That's usually a lot slower than a >>>>>>> typical one, but if it's more proper behavior, then it would make sense >>>>>>> to >>>>>>> go that route. >>>>>>> >>>>>>> >>>>>>> On 29 April 2014 14:49, Jörn Huxhorn <jhuxh...@googlemail.com>wrote: >>>>>>> >>>>>>>> Please keep in mind that synchronized is not fair. >>>>>>>> >>>>>>>> http://sourceforge.net/apps/trac/lilith/wiki/SynchronizedVsFairLock >>>>>>>> >>>>>>>> Yes, a fair ReentrantLock is way slower than an unfair one… but if >>>>>>>> starvation is caused by a logging framework then this is a serious >>>>>>>> issue in >>>>>>>> my opinion. >>>>>>>> >>>>>>>> Joern >>>>>>>> >>>>>>>> On 29. April 2014 at 01:05:26, Matt Sicker (boa...@gmail.com) >>>>>>>> wrote: >>>>>>>> > I'll delegate my arguments to the SO post about it: >>>>>>>> > >>>>>>>> http://stackoverflow.com/questions/442564/avoid-synchronizedthis-in-java >>>>>>>> > >>>>>>>> > In short, it's defensive programming. It's safer to synchronize >>>>>>>> on an >>>>>>>> > internal object than on this. Plus, it aids in concurrency >>>>>>>> throughput >>>>>>>> > instead of just using a synchronized method. >>>>>>>> > >>>>>>>> > >>>>>>>> > On 28 April 2014 12:45, Ralph Goers wrote: >>>>>>>> > >>>>>>>> > > Why are they not appropriate lock objects? Start a discussion >>>>>>>> before just >>>>>>>> > > changing them. >>>>>>>> > > >>>>>>>> > > Ralph >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > On Apr 28, 2014, at 10:40 AM, Matt Sicker wrote: >>>>>>>> > > >>>>>>>> > > In that case, Item 69: prefer concurrency utilities to wait and >>>>>>>> notify. >>>>>>>> > > Sounds like we can just use a plain Object instance to lock >>>>>>>> (which is >>>>>>>> > > pretty much equivalent to using ReentrantLock) when doing >>>>>>>> normal locks, but >>>>>>>> > > instead of using .notifyAll() and .wait(), we should use the >>>>>>>> Condition >>>>>>>> > > interface (which would require using Lock as well). >>>>>>>> > > >>>>>>>> > > I agree that using synchronized(object) makes sense when it's >>>>>>>> all that's >>>>>>>> > > being done. However, I've been changing instances of >>>>>>>> synchronized(this) and >>>>>>>> > > synchronized(foo) where foo is not an appropriate lock object >>>>>>>> (e.g., a >>>>>>>> > > string, or a non-final object, things like that). >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > On 28 April 2014 12:28, Ralph Goers wrote: >>>>>>>> > > >>>>>>>> > >> Yes, guidelines called out by Effective Java are appropriate >>>>>>>> when they >>>>>>>> > >> apply. >>>>>>>> > >> >>>>>>>> > >> As for concurrency, “New” isn’t always better than old. In a >>>>>>>> few places >>>>>>>> > >> you changed synchronized(object) to use a Lock instead. There >>>>>>>> is little to >>>>>>>> > >> no value in doing that and makes the code look a little more >>>>>>>> cluttered. >>>>>>>> > >> However, if a ReadWriteLock can be used in place of >>>>>>>> synchronized that is a >>>>>>>> > >> real benefit. >>>>>>>> > >> >>>>>>>> > >> The point of the guidelines are that when it comes to stuff >>>>>>>> like this, >>>>>>>> > >> unless there is a guideline written down that says the current >>>>>>>> code is >>>>>>>> > >> wrong discuss it on the list before making a change. >>>>>>>> > >> >>>>>>>> > >> Ralph >>>>>>>> > >> >>>>>>>> > >> On Apr 28, 2014, at 9:35 AM, Matt Sicker wrote: >>>>>>>> > >> >>>>>>>> > >> What about style things covered by Effective Java? These are >>>>>>>> pretty much >>>>>>>> > >> all good ideas. >>>>>>>> > >> >>>>>>>> > >> Also, how about some guidelines on concurrency? I'd recommend >>>>>>>> not using >>>>>>>> > >> the old concurrency stuff and instead using >>>>>>>> java.util.concurrent.* for more >>>>>>>> > >> effective concurrency. This doesn't include the Thread vs >>>>>>>> Runnable thing, >>>>>>>> > >> so that's still debatable. >>>>>>>> > >> >>>>>>>> > >> >>>>>>>> > >> On 28 April 2014 08:46, Gary Gregory wrote: >>>>>>>> > >> >>>>>>>> > >>> Perhaps if one breaks the build, it should be polite to >>>>>>>> revert that last >>>>>>>> > >>> commit... >>>>>>>> > >>> >>>>>>>> > >>> Gary >>>>>>>> > >>> >>>>>>>> > >>> >>>>>>>> > >>> On Mon, Apr 28, 2014 at 3:07 AM, Ralph Goers > >>> > wrote: >>>>>>>> > >>> >>>>>>>> > >>>> I think we need to develop and post some development >>>>>>>> “guidelines”, >>>>>>>> > >>>> “best practices” or whatever you want to call it for Log4j >>>>>>>> 2. Here are >>>>>>>> > >>>> some of the things I would definitely want on it. >>>>>>>> > >>>> >>>>>>>> > >>>> 1. Error on the side of caution. If you don’t understand it, >>>>>>>> don’t >>>>>>>> > >>>> touch it and ask on the list. If you think you understand it >>>>>>>> read it again >>>>>>>> > >>>> or ask until you are sure you do. Nobody will blame you for >>>>>>>> asking >>>>>>>> > >>>> questions. >>>>>>>> > >>>> 2. Don’t break the build - if there is the slightest chance >>>>>>>> the change >>>>>>>> > >>>> you are making could cause unit test failures, run all unit >>>>>>>> tests. Better >>>>>>>> > >>>> yet, get in the habit of always running the unit tests >>>>>>>> before doing the >>>>>>>> > >>>> commit. >>>>>>>> > >>>> 3. If the build breaks and you have made recent changes then >>>>>>>> assume you >>>>>>>> > >>>> broke it and try to fix it. Although it might not have been >>>>>>>> something you >>>>>>>> > >>>> did it will make others feel a lot better than having to fix >>>>>>>> the mistake >>>>>>>> > >>>> for you. Everyone makes mistakes. Taking responsibility for >>>>>>>> them is a good >>>>>>>> > >>>> thing. >>>>>>>> > >>>> 4. Don’t change things to match your personal preference - >>>>>>>> the project >>>>>>>> > >>>> has style guidelines that are validated with checkstyle, >>>>>>>> PMD, and other >>>>>>>> > >>>> tools. If you aren’t fixing a bug, fixing a problem >>>>>>>> identified by the >>>>>>>> > >>>> tools, or fixing something specifically called out in these >>>>>>>> guidelines then >>>>>>>> > >>>> start a discussion to see if the change is something the >>>>>>>> project wants >>>>>>>> > >>>> before starting to work on it. We try to discuss things >>>>>>>> first and then >>>>>>>> > >>>> implement the consensus reached in the discussion. >>>>>>>> > >>>> >>>>>>>> > >>>> Of course, the actual coding conventions we follow should >>>>>>>> also be >>>>>>>> > >>>> spelled out, such as indentation, braces style, import >>>>>>>> ordering and where >>>>>>>> > >>>> to use the final keyword. >>>>>>>> > >>>> >>>>>>>> > >>>> Ralph >>>>>>>> > >>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> > >>>> To unsubscribe, e-mail: >>>>>>>> log4j-dev-unsubscr...@logging.apache.org >>>>>>>> > >>>> For additional commands, e-mail: >>>>>>>> log4j-dev-h...@logging.apache.org >>>>>>>> > >>>> >>>>>>>> > >>>> >>>>>>>> > >>> >>>>>>>> > >>> >>>>>>>> > >>> -- >>>>>>>> > >>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>> > >>> Java Persistence with Hibernate, Second Edition >>>>>>>> > >>> JUnit in Action, Second Edition >>>>>>>> > >>> Spring Batch in Action >>>>>>>> > >>> Blog: http://garygregory.wordpress.com >>>>>>>> > >>> Home: http://garygregory.com/ >>>>>>>> > >>> Tweet! http://twitter.com/GaryGregory >>>>>>>> > >>> >>>>>>>> > >> >>>>>>>> > >> >>>>>>>> > >> >>>>>>>> > >> -- >>>>>>>> > >> Matt Sicker >>>>>>>> > >> >>>>>>>> > >> >>>>>>>> > >> >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > -- >>>>>>>> > > Matt Sicker >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > >>>>>>>> > >>>>>>>> > -- >>>>>>>> > Matt Sicker >>>>>>>> > >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>>>>>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>> Java Persistence with Hibernate, Second >>>>> Edition<http://www.manning.com/bauer3/> >>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>> Blog: http://garygregory.wordpress.com >>>>> Home: http://garygregory.com/ >>>>> Tweet! http://twitter.com/GaryGregory >>>>> >>>> >>>> >>>> >>>> -- >>>> Matt Sicker <boa...@gmail.com> >>>> >>> >>> >> >> >> -- >> Matt Sicker <boa...@gmail.com> >> > > > > -- > E-Mail: garydgreg...@gmail.com | ggreg...@apache.org > Java Persistence with Hibernate, Second > Edition<http://www.manning.com/bauer3/> > JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > Spring Batch in Action <http://www.manning.com/templier/> > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory >