Hi Ralph, It's not generic now (I guess it could be), you give it a Lock (the interface) when you build it. There is a convenience method to build one with a ReentrantLock.
See https://git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;a=blob;f=log4j-api/src/main/java/org/apache/logging/log4j/util/AutoCloseableLock.java;h=e860a2725425aec0c22ff0ab62843235001a7c24;hb=refs/heads/AutoCloseableLock Gary On Thu, Jul 21, 2016 at 8:52 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > Also, is AutoCloseableLock generic? What kind of lock is it? a > ReentrantLock, a ReentrantReadWriteLock, a StampedLock (which doesn’t seem > to implement Lock at all), a ReentrantReadWriteLock.ReadLock or a > ReentrantReadWriteLock.WriteLock? > > Ralph > > On Jul 21, 2016, at 5:22 PM, Gary Gregory <garydgreg...@gmail.com> wrote: > > Interesting idea! I updated the AutoCloseableLock with this change. > AutoCloseableLock now > implements Lock. > > Gary > > On Thu, Jul 21, 2016 at 5:14 PM, Matt Sicker <boa...@gmail.com> wrote: > >> And to distinguish it, why not just give it a signature like: >> >> AutoCloseable autoLock(); >> >> try (final AutoCloseable a = lock.autoLock()) { >> // ... >> } >> >> This way you can inherit from Lock as well. >> >> On 21 July 2016 at 19:12, Matt Sicker <boa...@gmail.com> wrote: >> >>> AutoCloseable versus AutoCloseableLock. >>> >>> On 21 July 2016 at 18:19, Gary Gregory <garydgreg...@gmail.com> wrote: >>> >>>> On Thu, Jul 21, 2016 at 4:12 PM, Matt Sicker <boa...@gmail.com> wrote: >>>> >>>>> Well in that case, I guess it doesn't introduce garbage. I'm back to >>>>> supporting this, then. >>>>> >>>>> Can't you just do: >>>>> >>>>> try (final AutoCloseable a = configLock.lock()) { >>>>> // ... >>>>> } >>>>> >>>> >>>> That's just the example I gave! Am I missing something? ;-) >>>> >>>> Gary >>>> >>>>> >>>>> On 21 July 2016 at 18:10, Gary Gregory <garydgreg...@gmail.com> wrote: >>>>> >>>>>> Hi All, >>>>>> >>>>>> What extra garbage? (Putting aside if this a "good" idea or not.) A >>>>>> local variable here does not create an extra object to be GC'd. >>>>>> >>>>>> For example, in LoggerContext, we have: >>>>>> >>>>>> private final Lock configLock = new ReentrantLock(); >>>>>> ... >>>>>> >>>>>> @Override >>>>>> public void stop() { >>>>>> ... >>>>>> configLock.lock(); >>>>>> try { >>>>>> ... >>>>>> } finally { >>>>>> configLock.unlock(); >>>>>> } >>>>>> ... >>>>>> } >>>>>> >>>>>> >>>>>> Which I propose to replace with: >>>>>> >>>>>> private final AutoCloseableLock configLock = >>>>>> AutoCloseableLock.forReentrantLock(); >>>>>> ... >>>>>> >>>>>> @Override >>>>>> public void stop() { >>>>>> ... >>>>>> try (final AutoCloseableLock l = configLock.lock()) { >>>>>> ... >>>>>> } >>>>>> ... >>>>>> } >>>>>> >>>>>> Yes, AutoCloseableLock is an extra object on top of the Lock itself, >>>>>> I'll give you that of course. >>>>>> >>>>>> The "l" lvar is what the Java syntax requires but there is no extra >>>>>> object created by configLock.lock(), which returns "this". >>>>>> >>>>>> Gary >>>>>> >>>>>> >>>>>> On Thu, Jul 21, 2016 at 3:12 PM, Matt Sicker <boa...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Yeah, adding garbage does seem like a bad idea in this case. >>>>>>> >>>>>>> On 21 July 2016 at 16:30, Ralph Goers <ralph.go...@dslextreme.com> >>>>>>> wrote: >>>>>>> >>>>>>>> The more I think about this the more I dislike it. This requires >>>>>>>> that a temporary variable be created for no other reason than to >>>>>>>> satisfy >>>>>>>> the compiler. It defeats the work Remko has been doing to make the code >>>>>>>> garbage free as it is explicitly creating objects it doesn’t even use. >>>>>>>> >>>>>>>> Ralph >>>>>>>> >>>>>>>> On Jul 21, 2016, at 2:12 PM, Gary Gregory <garydgreg...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hi Matt, >>>>>>>> >>>>>>>> AutoCloseableLock cannot implement Lock because lock() is void and >>>>>>>> I count on AutoCloseableLock#lock() returning "this" for the >>>>>>>> pattern: >>>>>>>> >>>>>>>> try (final AutoCloseableLock l = LOCK.lock()) { >>>>>>>> return MAP.containsKey(name); >>>>>>>> } >>>>>>>> >>>>>>>> I could rename lock() to doLock() and a void lock() but that seems >>>>>>>> a bit confusing to have both methods. >>>>>>>> >>>>>>>> This is in the branch AutoCloseableLock which I'd like to merge. >>>>>>>> >>>>>>>> Thoughts? >>>>>>>> >>>>>>>> Gary >>>>>>>> >>>>>>>> On Fri, Jun 24, 2016 at 7:42 AM, Matt Sicker <boa...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> I kinda imagined AutoCloseableLock to implement both AutoCloseable >>>>>>>>> and Lock. >>>>>>>>> >>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>> From: <ggreg...@apache.org> >>>>>>>>> Date: 24 June 2016 at 03:50 >>>>>>>>> Subject: [1/4] logging-log4j2 git commit: Add AutoCloseableLock. >>>>>>>>> To: comm...@logging.apache.org >>>>>>>>> >>>>>>>>> >>>>>>>>> Repository: logging-log4j2 >>>>>>>>> Updated Branches: >>>>>>>>> refs/heads/AutoCloseableLock [created] 72d9978c6 >>>>>>>>> >>>>>>>>> >>>>>>>>> Add AutoCloseableLock. >>>>>>>>> >>>>>>>>> Project: >>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>>>>>>> Commit: >>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/40efa80a >>>>>>>>> Tree: >>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/40efa80a >>>>>>>>> Diff: >>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/40efa80a >>>>>>>>> >>>>>>>>> Branch: refs/heads/AutoCloseableLock >>>>>>>>> Commit: 40efa80a1a9745d7f9162b4f7ce96a7571a1c336 >>>>>>>>> Parents: bc296c5 >>>>>>>>> Author: Gary Gregory <ggreg...@apache.org> >>>>>>>>> Authored: Thu Jun 23 21:59:02 2016 -0700 >>>>>>>>> Committer: Gary Gregory <ggreg...@apache.org> >>>>>>>>> Committed: Thu Jun 23 21:59:02 2016 -0700 >>>>>>>>> >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> .../logging/log4j/util/AutoCloseableLock.java | 44 >>>>>>>>> ++++++++++++++++++++ >>>>>>>>> 1 file changed, 44 insertions(+) >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/40efa80a/log4j-api/src/main/java/org/apache/logging/log4j/util/AutoCloseableLock.java >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> diff --git >>>>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/AutoCloseableLock.java >>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/AutoCloseableLock.java >>>>>>>>> new file mode 100644 >>>>>>>>> index 0000000..65aa581 >>>>>>>>> --- /dev/null >>>>>>>>> +++ >>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/AutoCloseableLock.java >>>>>>>>> @@ -0,0 +1,44 @@ >>>>>>>>> +/* >>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or >>>>>>>>> more >>>>>>>>> + * contributor license agreements. See the NOTICE file >>>>>>>>> distributed with >>>>>>>>> + * this work for additional information regarding copyright >>>>>>>>> ownership. >>>>>>>>> + * The ASF licenses this file to You under the Apache license, >>>>>>>>> Version 2.0 >>>>>>>>> + * (the "License"); you may not use this file except in >>>>>>>>> compliance with >>>>>>>>> + * the License. You may obtain a copy of the License at >>>>>>>>> + * >>>>>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 >>>>>>>>> + * >>>>>>>>> + * Unless required by applicable law or agreed to in writing, >>>>>>>>> software >>>>>>>>> + * distributed under the License is distributed on an "AS IS" >>>>>>>>> BASIS, >>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express >>>>>>>>> or implied. >>>>>>>>> + * See the license for the specific language governing >>>>>>>>> permissions and >>>>>>>>> + * limitations under the license. >>>>>>>>> + */ >>>>>>>>> +package org.apache.logging.log4j.util; >>>>>>>>> + >>>>>>>>> +import java.util.Objects; >>>>>>>>> +import java.util.concurrent.locks.Lock; >>>>>>>>> + >>>>>>>>> +public class AutoCloseableLock implements AutoCloseable { >>>>>>>>> + public static AutoCloseableLock lock(final Lock lock) { >>>>>>>>> + Objects.requireNonNull(lock, "lock"); >>>>>>>>> + lock.lock(); >>>>>>>>> + return new AutoCloseableLock(lock); >>>>>>>>> + } >>>>>>>>> + >>>>>>>>> + private final Lock lock; >>>>>>>>> + >>>>>>>>> + public AutoCloseableLock(final Lock lock) { >>>>>>>>> + this.lock = lock; >>>>>>>>> + } >>>>>>>>> + >>>>>>>>> + @Override >>>>>>>>> + public void close() { >>>>>>>>> + this.lock.unlock(); >>>>>>>>> + } >>>>>>>>> + >>>>>>>>> + public AutoCloseableLock lock() { >>>>>>>>> + this.lock.lock(); >>>>>>>>> + return this; >>>>>>>>> + } >>>>>>>>> +} >>>>>>>>> \ No newline at end of file >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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> >>>>> >>>> >>>> >>>> >>>> -- >>>> 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 > > > -- 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