在我的情况下,某个方法可以根据条件在同步和异步模式下运行。
我所做的是使用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改进它,但我没有任何线索。谁能告诉我如何改进它? THX
答案 0 :(得分:0)
您可以使用Java synchronizedCollection(Collection<T> c)
中的Collections
方法作为您要执行的操作的模式。
为您的类定义一个接口,并通过在其周围放置一个执行锁定/解锁逻辑的包装器来实现同步,但将业务逻辑委派给您原始的非同步类。您的包装器将实现接口(即,实现specialMethod
),但会执行并锁定和解锁,然后调用原始类来执行实际逻辑。
不是将标志传递给方法,而是在构造类的对象时使用标志来决定要构造的类的类型,原始类或原始类以及同步包装器。
或者(稍微简单的方法),创建类的扩展名(例如SynchronizedClassName extends ClassName
)并覆盖specialMethod
。在那里进行锁定(无条件地),然后调用超类中的逻辑。
再次,决定构造哪个对象以在同步或非同步之间切换。
如果您的同步包装器公开它包含的非同步类,那么如果您想在同步和非同步访问之间切换,则可以访问它。
示例:
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);