2014-11-14 2 views
2

람다 식으로 AutoClosable을 생성하여 try-with-resource 구문에서 잠금을 해제 할 때 문제가 있습니까?람다로 잠금 해제

lock.lock(); 
try (AutoCloseable auto = lock::unlock) { 
    /*...*/ 
} 
catch (Exception exp) { 
    /*...*/ 
} 

나는 더 느릴 수도 있고 더 많은 쓰레기를 생성 할 수도 있다고 생각했습니다. 그러나 나는 마이크로 벤치 마크와의 성능 차이를 발견 할 수 없었다. 나는 당신의 자신의 특별한 인터페이스를 만드는 것이 좋습니다

+1

더 많은 쓰레기가 생성됩니다. 바운드 메소드 참조는 할당을 포함합니다. –

+0

@Brian Goetz : 코드가 성능 관련성이있는 경우 할당을 최적화 할 수 있습니다. 이것은이 코드가 벤치 마크에서 실행되었을 때 일어난 일일 것입니다. – Holger

답변

4

는 선언 Exception 없애 :

interface Cleanup extends AutoCloseable { 
    public void close(); 
} 

이 ...

Lock lock=new ReentrantLock(); 
lock.lock(); 
try(Cleanup x=lock::unlock) { 
    // action 
} 

그것은이 임시 객체를 만들 수 있다는 사실이다 (사양은이 개방 잎 구현), 하나의 임시 객체는 현대 JVM과 일치하지 않습니다. 이 패턴뿐만 아니라 다른 사용 사례를 많이 적용 할 수

참고 : 여기에

Runnable r1, r2; 

try(Cleanup x=r2::run) { r1.run(); } 

은 모두 Runnable의 실행이 보장된다. try {} finally {}의 이점은 두 runnables가 모두 예외를 throw하면 이러한 예외가 Throwable.addSuppressed을 사용하여 체인화되고 finally에 예외가 발생하면 try 블록에 예외가 발생하지 않는다는 점입니다.