Java一个关键部分多个信号量

时间:2015-12-12 15:02:57

标签: java multithreading frameworks semaphore

我需要知道,如果有一些框架可以为我提供这种功能。我在一个方法中有一个关键部分,我需要很少的其他方法等待这个关键部分执行和完成。如果关键部分不活跃,那些方法应该流畅地工作。

如果仅在没有线程处于semaphored方法时输入临界区。

如:

public class Worker {

    private Critical critical = null;
    private CriticalDependent dep1 = null; 
    private CriticalDependent dep2 = null;

    public Worker() {

        critical = new Critical();
        dep1 = critical.registerDependent();
        dep2 = critical.registerDependent();

    }
    public void critical() {
         critical.enter();
         critical.waitForClearToGo();

         // protected unique code
         // change resource handle etc

         critical.exit();
    }

    public void dependent1() {
         critical.checkWaitAndUnsetClearToGo(this.dep1);

         // some dependent code
         // use resource handle

         critical.setClearToGo(this.dep1);
    }

    public void dependent2() {
         critical.checkWaitAndUnsetClearToGo(this.dep2);

         // some dependent code
         // use resource handle

         critical.setClearToGo(this.dep2);
    }
}

我可以找出一些解决方案,但我更喜欢使用现有的框架。我找不到现有的。提前谢谢。

2 个答案:

答案 0 :(得分:2)

使用标准Java Semaphore

答案 1 :(得分:1)

你可以用Erik已经讲过的Java Semaphore来做到这一点。 但是,您需要一个具有2个许可证,以便您的2个依赖方法可以同时运行,但关键部分将阻止这两个依赖方法。

Semaphore semaphore = new Semaphore(2, true);  // Make it fair, so critical section won't wait unnecessarily

public void critical() {
    semaphore.acquire(2); // Blocks both dependents, waiting if they're not available
    ...
    semaphore.release(2);
}

public void dep1() {
    semaphore.acquire(); // Blocks only if critical() has both permits
    ...
    semaphore.release();
}

public void dep2() {
    semaphore.acquire(); // Ditto, dep1() can have the other permit
    ...
    semaphore.release();
}