在某些条件

时间:2017-01-19 14:42:41

标签: java multithreading asynchronous

在我的情况下,某个方法可以根据条件在同步和异步模式下运行。

我所做的是使用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

1 个答案:

答案 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);