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