我们有这样的东西:
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) {}
}
}在一个同步方法中会有多个线程在等待吗?或者我应该在我的方法中使用同步块而不是同步块?(在“做某事”部分)
发布于 2015-08-17 22:34:32
,不,它不会:由于synchronized,其他Threads将阻塞同一个TaskExecutor实例。
由于您有一个static Semaphore,所以没有必要使用synchronized,因为您的信号量确保了一个更强的约束:线程不仅在同一个TaskExecutor上阻塞,而且在全局上阻塞(只要获得/释放信号量与synchronized相当)。
https://stackoverflow.com/questions/32060720
复制相似问题