gpt4 book ai didi

Java 锁定和解锁的不同方法。如何尝试/最终?

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:25 27 4
gpt4 key购买 nike

我想弄清楚什么是使用带锁的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com