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>