Concurrency 用lambda解锁

Concurrency 用lambda解锁,concurrency,lambda,java-8,Concurrency,Lambda,Java 8,通过lambda表达式生成一个AutoClosable来解锁try-with-resource构造中的锁时,是否有任何问题 lock.lock(); try (AutoCloseable auto = lock::unlock) { /*...*/ } catch (Exception exp) { /*...*/ } 我想它可能会慢一些,或者会产生更多的垃圾。但是,我无法真正找到可能有缺陷的微基准测试的任何显著性能差异。我建议您创建自己的专用接口,以消除声明的异常: 的确

通过lambda表达式生成一个AutoClosable来解锁try-with-resource构造中的锁时,是否有任何问题

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

我想它可能会慢一些,或者会产生更多的垃圾。但是,我无法真正找到可能有缺陷的微基准测试的任何显著性能差异。

我建议您创建自己的专用接口,以消除声明的异常:

的确,这可能会创建一个临时对象——规范将其留给实现,但单个临时对象与现代JVM不匹配

请注意,此模式也可以应用于许多其他用例:

Runnable r1, r2;

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

在这里,两个runnable都保证被执行。与try{}finally{}相比,try{finally{}的优势在于,如果两个可运行程序都抛出一个异常,那么这些异常将使用链接,而抛出的异常最终会完全隐藏try块中抛出的异常。

它将生成更多垃圾。绑定方法引用涉及分配。@Brian Goetz:但是如果代码变得与性能相关,则可以优化分配。这可能是在基准测试中执行此代码时发生的情况。
Lock lock=new ReentrantLock();
lock.lock();
try(Cleanup x=lock::unlock) {
    // action
}
Runnable r1, r2;

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