首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同步方法中等待信号量

在同步方法中等待信号量
EN

Stack Overflow用户
提问于 2015-08-17 22:27:54
回答 1查看 1.1K关注 0票数 1

我们有这样的东西:

代码语言:javascript
复制
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()而不是信号量呢?它也有同样的问题?

代码语言:javascript
复制
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) {} 
    } 
}

在一个同步方法中会有多个线程在等待吗?或者我应该在我的方法中使用同步块而不是同步块?(在“做某事”部分)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 22:34:32

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

由于您有一个static Semaphore,所以没有必要使用synchronized,因为您的信号量确保了一个更强的约束:线程不仅在同一个TaskExecutor上阻塞,而且在全局上阻塞(只要获得/释放信号量与synchronized相当)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32060720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档