2013-05-15 42 views
13

Wraz z try-with-resource wprowadzonym w języku Java 7, byłem zaskoczony, że Lock nie został doposażony jako AutoCloseable. Wydawało się dość proste, więc dodałem mu się następująco:Jakiekolwiek ryzyko w opakowaniu z możliwością automatycznego zamykania dla java.util.concurrent.locks.Lock?

class Lock implements AutoCloseable { 
    private final java.util.concurrent.locks.Lock _lock; 
    Lock(java.util.concurrent.locks.Lock lock) { 
     _lock = lock; 
     _lock.lock(); 
    } 
    @Override 
    public void close() { 
     _lock.unlock(); 
    } 
} 

Działa to z klasą AutoCloseableReentrantReadWiteLock i używanie jest w następujący sposób:

try (AutoCloseableReentrantReadWiteLock.Lock l = _lock.writeLock()) { 
    // do something 
}   

Ponieważ wydaje się tak proste i kanoniczny Zastosowanie auto zamykanie RAII Myślę, że musi być dobry powód, aby tego nie robić. Ktoś wie?

+0

@rxg Mam zamiar powrócić do większości edycji, moje zdziwienie nie było, gdy została wprowadzona, ale ostatnio, kiedy użyłem jej do blokady –

+0

Brak problemów, ale czy możesz poprawić link do AutoCloseable? – rxg

Odpowiedz

18

To była wielka debata gdy try-with-resources został zaproponowany w luty/marzec 2009.

Josh Bloch, autor wniosku, że „This construct was designed for one thing and one thing only: resource management. It was not designed for locking.

Był tam osobny wniosek na pokrycie zamki oddzielnie, ale nigdzie się to nie udało.

myślę głównych powodów zamki nie były objęte zostały:

    nie
  • możliwe dodanie metody do interfejsu w Javie 7
  • wydajność trafienie tworzenia dodatkowego otoki obiekt, który realizowany poprawny interfejs
  • zastrzeżenia filozoficzne do Lock są innym rodzajem zasobu z uchwytów plików (np. Utworzenie Lock nie pociąga za sobą wywołania metody lock)

Możesz śledzić wszystkie historyczne argy-bargy na the archive page, na przykład this thread.

+0

Dziękuję za informacje; dla mnie zamek wydaje się być zasobem, ale być może są rzeczy, których mi brakuje. Praca w wiosennym świecie, wydajność uderzenia z owijki jest nieistotna. –

+0

@MiserableVariable: Blokada jest zasobem, przynajmniej dla mnie i Dijkstry (: D), zobacz np. [Opis algorytmu bankiera] (http://en.wikipedia.org/wiki/Banker's_algorithm#Resources). Nie jest konieczne tworzenie nowego obiektu za każdym razem (potrzebujesz tylko czegoś, co ma metodę "close" i można jej użyć wiele razy). – maaartinus

+0

@maaartinus Obawiam się, że nie rozumiem, co mówisz. Jeśli masz metodę close, to potrzebujesz również metody open, która jest tym, co tworzy dla klasy Lock. –