gpt4 book ai didi

java - 如何使用锁包装器进行自动关闭?

转载 作者:行者123 更新时间:2023-12-02 04:28:19 25 4
gpt4 key购买 nike

我写了以下wrapepr:

public class AutoCloseableLockWrapper implements AutoCloseable, Lock{
private final Lock lock;
public AutoCloseableLockWrapper(Lock l) {
this.lock = l;
}
@Override
public void lock() {
this.lock.lock();
}

@Override
public void lockInterruptibly() throws InterruptedException {
lock.lockInterruptibly();
}

@Override
public boolean tryLock() {
return lock.tryLock();
}

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return lock.tryLock(time,unit);
}

@Override
public void unlock() {
lock.unlock();
}

@Override
public Condition newCondition() {
return lock.newCondition();
}
@Override
public void close() {
this.lock.unlock();
}
}

在我的代码中我这样使用它:

public class ReadWriteMap implements Map {

private HashMap map = new HashMap();
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock readLock = readWriteLock.readLock();
private Lock writeLock = readWriteLock.writeLock();

@Override
public int size() {
try (AutoCloseableLockWrapper autoCloseableLockWrapper = new AutoCloseableLockWrapper(readLock)) {
autoCloseableLockWrapper.lock();
return map.size();
}

}

@Override
public boolean isEmpty() {
try (AutoCloseableLockWrapper autoCloseableLockWrapper = new AutoCloseableLockWrapper(readLock)) {
autoCloseableLockWrapper.lock();
return map.isEmpty();
}
}

@Override
public boolean containsKey(Object key) {
try (AutoCloseableLockWrapper autoCloseableLockWrapper = new AutoCloseableLockWrapper(readLock)) {
autoCloseableLockWrapper.lock();
return map.containsKey(key);
}
}
...
}

我不想在每个方法中创建包装器。

有没有办法结合单个包装器并尝试使用资源?

最佳答案

你的设计过于复杂了。如果您的 AutoCloseableLockWrapper 有意公开底层 Lock 支持的所有操作,则将其设为私有(private)并为每个 添加委托(delegate)方法是没有意义的。 code>Lock 的方法。您可以简单地将 Lock 引用 public 以允许其使用,或者完全不使用它,因为创建包装器的代码已经引用了 Lock .

您想要做的就是支持单个操作,解锁,该操作应被视为AutoCloseable

Java 8 解决方案可能如下所示

import java.util.concurrent.locks.Lock;

public interface AutoUnlock extends AutoCloseable {
public static AutoUnlock lock(Lock lock) {
lock.lock();
return lock::unlock;
}

@Override
public void close(); // no checked exceptions
}

它可以像这样使用:

Lock lock=…
// …
try(AutoUnlock u=AutoUnlock.lock(lock)) {
// critical code
}
// …
try(AutoUnlock u=AutoUnlock.lock(lock)) {
// critical code
}

如果您担心实例创建(通常这不是问题),您可以重复使用AutoCloseable:

AutoUnlock reusable=lock::unlock;
// …
lock.lock();
try(AutoUnlock u=reusable) {
// critical code
}
// …
lock.lock();
try(AutoUnlock u=reusable) {
// critical code
}

对我来说,它看起来不太清楚,因为 lock();try 语句在语法上没有耦合,可能会被意外分开。但如果锁具有非本地范围,您可以通过创建实用方法来解决此问题:

final Lock lockInstance; // this field name is to prevent confusion with the lock() method
final AutoUnlock reusable;

YourConstructor(Lock lock) {// you may get the Lock as a parameter
lockInstance=lock; // or create one here, right in the constructor
reusable=lockInstance::unlock;
}

AutoUnlock lock() {
lockInstance.lock();
return reusable;
}
void doSomething() {
// …
try(AutoUnlock u=lock()) {
// critical code
}
// …
try(AutoUnlock u=lock()) {
// critical code
}
}

我认为,如果需要的话,将此逻辑反向移植到 Java 7 代码中并不太难。

关于java - 如何使用锁包装器进行自动关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31854049/

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