我们有类似的东西:
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块? (在“做某事”部分)
答案 0 :(得分:2)
不会不会:由于Threads
,其他TaskExecutor
会阻止同一synchronized
个实例。
由于你有一个static Semaphore
,synchronized
是不必要的,因为你的信号量确保一个更强的约束:线程不仅在同一个TaskExecutor
上阻塞而且在全局阻塞(只要信号量是获取/发布等效到synchronized
)