- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想弄清楚什么是使用带锁的 try/finally 的最佳方式。
当我在同一个地方有 lock()
和 unlock()
时,我只使用 try/finally
block 作为 JavaDoc还建议:
lock.lock();
try{
// do something
} finally {
lock.unlock();
}
我想知道当 lock()
和 unlock()
调用分开时,使用 try/finally
的最佳做法是什么方法。
例如,考虑以下内容:
public class X {
private ReentrantLock lock = new ReentrantLock();
public void pickUp(){
lock.lock();
// do something
}
public void putDown(){
// do something
lock.unlock();
}
}
我要做的是将 try/finally
block 放在上层,也就是说,每当我调用方法 pickUp()
和 putDown ()
。例如,在 run()
方法内部:
// class code
X x = new X();
public void run(){
try{
x.pickUp();
// do something
} finally {
x.putDown();
}
}
这是正确的方法吗?
非常感谢。
最佳答案
这实际上是申请 execute around method pattern 的一个很好的候选人.
如果您类(class)的客户需要对需要适当初始化和/或适当清理的资源做一些事情,您可以将清理工作交给客户,并希望文档和快速失败行为促使客户进入正确处理资源。
execute around 方法模式通过再次将初始化和清除从客户端手中移出,解决了这个难题。基本上,您引入了一种方法来正确地初始化和清理资源,然后将其交给该资源的 Consumer
。
理想情况下,您甚至可以完全封装执行初始化和清理的方法。
例如,基于您的示例代码:
private ReentrantLock lock = new ReentrantLock();
private void pickUp() { // now private
lock.lock();
// do something
}
private void putDown() { // now private
// do something
lock.unlock();
}
public void use(Consumer<X> consumer) {
try {
pickUp();
consumer.accept(this); // client gets its hands on the properly initialized resource.
} finally {
putDown();
}
}
客户端仍然可以对资源做一些乱七八糟的事情,比如在消费者之外使用它,在清理之后,但这已经很难做到了。而困难的部分,记住正确的初始化和清理,不再是客户关心的问题。
关于Java 锁定和解锁的不同方法。如何尝试/最终?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40628594/
为什么 pickle 重用现有的 Python 类“C”而不是从 pickle 字节重建类?有没有一种方法可以在没有副作用的情况下 pickle 和解 pickle ? 这是我的回复 session
我是一名优秀的程序员,十分优秀!