Actually, I believe there was a case where I did that because the method in the subclass used java.util.concurrent instead of requiring method synchronization.
Ralph On Apr 30, 2014, at 7:19 AM, Remko Popma <remko.po...@gmail.com> wrote: > 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 > 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 <boa...@gmail.com> > > > > > -- > Matt Sicker <boa...@gmail.com> > > > > -- > 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 >