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