Please: try-with-resouces Lock support!

Howard Lovatt howard.lovatt at gmail.com
Fri Feb 25 16:40:42 PST 2011


The use case:

try ( new ReentrantLock() ) { ... }

makes no sense, you *need* to share the lock. However if Lock were
modified to use defender methods:

interface Lock extends AutoCloseable {

  ... // As before

  Lock autoLock()  default Trait.autoLock;

  // Similarly autoLockInterruptibly

  void close() default Trait.close;

  static final class Trait {
    public Lock autoLock(final Lock self) {
      self.lock();
      return self;
    }

    // Similarly autoLockInterruptibly

    public void close(final Lock self) {
      self.unlock();
    }
  }
}

Then

try (l.autoLock()) { ... }

would work.

 -- Howard.

On 24 February 2011 11:42, David Holmes <David.Holmes at oracle.com> wrote:
> I suspect Joe will shut this down as being out of scope for coin-dev in
> its present state, but my 2c
>
> Gernot Neppert said the following on 02/24/11 03:31:
>> this has been discussed here before, but somehow got lost:
>> Wouldn't it be very handy having a class
>> "java.util.concurrent.AutoLockable" that could be used as follows:
>
> No not really. The way try-with-resources has evolved really doesn't
> mesh with lock usage. As Neal already mentioned the overhead of creating
> the AutoLockable per lock operation is simply prohibitive. Even if you
> retrofitted Lock with AutoCloseable you would still need (given t-w-r
> synatx) to have a helper method to acquire the lock and return it so you
> can assign it to the local:
>
>  try ( Lock l = Lock.lockAndReturn(lock) ) {
>   ...
>  }
>
> This is just a round-hole vs square-peg situation, and trying to make it
> fit really doesn't add anything to clarity or useability in my view.
>
> I can imagine a more general (more specific?) t-w-r that might allow:
>
> try (lock) {
>    ...
> }
>
> but that would be for future debate.
>
> Cheers,
> David Holmes
>
>> try(AutoLockable locked = AutoLockable.locked(lock))
>> {
>> // Do something in locked scope
>> }
>>
>> It would look something like this:
>>
>> package java.util.concurrent.locks;
>>
>> public abstract class AutoLockable implements AutoCloseable {
>>
>>      public static AutoLockable locked(final Lock lock)
>>      {
>>          lock.lock();
>>          return new AutoLockable() {
>>
>>              @Override
>>              public void close() {
>>                  lock.unlock();
>>              }
>>          };
>>      }
>>
>>      public abstract void close();
>> }
>>
>>
>
>



-- 
  -- Howard.



More information about the coin-dev mailing list