等待同步方法内的信号量

时间:2015-08-17 22:27:55

标签: java multithreading

我们有类似的东西:

public class TaskExecutor extends Thread {    
    private static Semaphore globalStackLocker;

    private synchronized Object popFromGlobalStack() {
        //do something
        try {
            globalStackLocker.acquire();
        } catch (InterruptedException e) {}
    }
    //somwhere here are methods that allow to release semaphore
}

我的想法是我有同步方法,我检查我的信号量。如果此信号量被锁定,则该线程将等待它解锁。

问题是 - 在等待的同时,是否会为其他线程解锁同步方法?

对我来说看起来像“是” - 一个线程仍在等待,所以另一个线程可以尝试执行此方法。实际上,我找到了一些似乎证明这一点的答案,但我想确定。

好的,我明白了。如果我使用.wait()而不是信号量怎么办?它有同样的问题吗?

public class MyClass() extends Thread {
    private static Object lock;
    private synchronized void myPop() { 
        //do something with shared memory (that's why I need synchronize) 
        try { lock.wait() } catch (InterruptedException e) {} 
    } 
}

一个同步方法中是否有多个线程在等待?或者我可能只是在我的方法中使用synchronized块? (在“做某事”部分)

1 个答案:

答案 0 :(得分:2)

不会不会:由于Threads,其他TaskExecutor会阻止同一synchronized个实例。

由于你有一个static Semaphoresynchronized是不必要的,因为你的信号量确保一个更强的约束:线程不仅在同一个TaskExecutor上阻塞而且在全局阻塞(只要信号量是获取/发布等效synchronized