53 votes

Les serrures sont-elles autofermables ?

Locks -ils auto-fermables ? C'est-à-dire au lieu de :

 Lock someLock = new ReentrantLock();
someLock.lock();
try
{
    // ...
}
finally
{
    someLock.unlock();
}

...Puis-je dire:

 try (Lock someLock = new ReentrantLock())
{
    someLock.lock();
    // ...
}

... en Java 7 ?

63voto

Stephen Points 701

Je cherchais à le faire moi-même et j'ai fait quelque chose comme ceci:

 public class CloseableReentrantLock extends ReentrantLock implements AutoCloseable { 
   public CloseableReentrantLock open() { 
      this.lock();
      return this;
   }

   @Override
   public void close() {
      this.unlock();
   }
}

et puis ceci comme usage pour la classe :

 public class MyClass {
   private final CloseableReentrantLock lock = new CloseableReentrantLock();

   public void myMethod() {
      try(CloseableReentrantLock closeableLock = lock.open()) {
         // locked stuff
      }
   }
}

3voto

maaartinus Points 12510

Il n'y a pas de solution parfaite, à moins d'ignorer les coûts d'allocation (la plupart des programmeurs d'applications le peuvent, mais pas les rédacteurs de la bibliothèque de verrous). Ensuite, vous pouvez utiliser un wrapper

 @RequiredArgsConstructor(access=AccessLevel.PRIVATE)
public final class MgLockCloseable implements AutoCloseable {
    public static MgLockCloseable tryLock(Lock lock) {
        return new MgLockCloseable(lock.tryLock() ? lock : null);
    }

    public static MgLockCloseable lock(Lock lock) {
        lock.lock();
        return new MgLockCloseable(lock);
    }

    @Override public void close() {
        if (isLocked()) {
            lock.unlock();
        }
    }

    public boolean isLocked() {
        return lock != null;
    }

    @Nullable private final Lock lock;
}

dans cette construction

 try (LockCloseable lockCloseable = LockCloseable.lock(lock)) {
    doSomethingUnderLock();
} // automatic release

Voir aussi ma question sur CR .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X