There are legitimate reasons to do that as long as you maintain thread-safety such as the case Ralph mentioned. Though that would probably require full control of the API from top to bottom-ish.
On 30 April 2014 10:22, Ralph Goers <ralph.go...@dslextreme.com> wrote: > 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<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 >> > > > -- Matt Sicker <boa...@gmail.com>