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