gpt4 book ai didi

java - 在某些条件下在同步和异步模式之间切换

转载 作者:行者123 更新时间:2023-12-03 13:09:18 24 4
gpt4 key购买 nike

就我而言,某些方法可能会根据条件在同步和异步模式下运行。

我所做的是使用 reentrantlock做开关。代码如下所示。

private Lock modeLock = new ReentrantLock(true);
public void specialMethod(boolean condition)}
Callable<Result> c = () -> {
if(condition)
modeLock.lock();
else{
try {
modeLock.tryLock(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
} finally {
modeLock.unlock();
}
//do something here
if(condition)
modeLock.unlock();
return result;
};
pool.submit(c);
}

它对我有用,但似乎很愚蠢。我想我可以通过 ReentrantLock 的 Condition 来改进它,但我没有任何线索。谁能告诉我如何改进它?谢谢

最佳答案

您或许可以使用 synchronizedCollection(Collection<T> c)来自 Java 的方法 Collections作为您尝试做的事情的模式。

为您的类定义一个接口(interface)并通过在其周围放置一个执行锁定/解锁逻辑但将业务逻辑委托(delegate)给原始未同步类的包装器来实现同步。您的包装器将实现接口(interface)(即实现 specialMethod ),但会执行并锁定和解锁,然后调用原始类来执行实际逻辑。

不是将标志传递给方法,而是在构造类的对象时使用标志来决定要构造什么类型的类,原始类或原始类加上同步包装器。

或者(一种稍微简单的方法),创建你的类的扩展(例如 SynchronizedClassName extends ClassName )并覆盖 specialMethod .在那里(无条件地)锁定,然后调用父类(super class)中的逻辑。

同样,决定构建哪个对象以在同步或非同步之间切换。

如果您的同步包装器公开了它包含的非同步类,那么如果您想在同步和非同步访问之间切换,则可以访问它。

例子:

interface SpecialInterface {
void specialMethod();
}

// Original class
class SpecialClass implements SpecialInterface {
public void specialMethod() {
... // logic with no locking
}

class SynchronizedSpecialClass implements SpecialInterface {
private SpecialClass logic;
private Lock modeLock = new ReentrantLock(true);

public SynchronizedSpecialClass(SpecialClass logic) {
this.logic = logic;
}

public void specialMethod() {
try {
modeLock.lock();
logic.specialMethod();
} finally {
modelock.unlock();
}
}
}

// use
SpecialInterface o = new SpecialClass();
if (lockingRequired) o = new SynchronizedSpecialClass(o);

关于java - 在某些条件下在同步和异步模式之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41744569/

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