信号量函数中的死锁

 Yomon-00 发布于 2023-02-13 14:52

问题1:

我正在阅读Java中的Hard-core多线程,并且确实进入了下面的信号量示例.

package com.dswgroup.conferences.borcon.threading;

public class ResourceGovernor {
    private int count;
    private int max;

    public ResourceGovernor(int max) {
        count = 0;
        this.max = max;
    }

    public synchronized void getResource(int numberof) {
        while (true) {
            if ((count + numberof) <= max) {
                count += numberof;
                break;
            }
            try {
                wait();
            } catch (Exception ignored) {}
        }
    }

    public synchronized void freeResource(int numberof) {
        count -= numberof;
        notifyAll();
    }
}

我觉得这可能导致以下情况陷入僵局:

正在使用所有资源,并且新线程会询问不可用的资源.由于它在synchronized函数内部等待,因此使用资源的其他线程无法释放资源,因为freeResource函数也被同步,并且由于等待线程已经取得对象级别锁定,它们无法进入该函数ResourceGovernor

还有另一个问题是,如果某个线程试图释放更多no,则尚未验证.资源比它获得的资源.但是这个问题是次要的,可以通过使用线程名称和资源计数的同步映射来轻松修复.

但我能否安全地说我正确诊断出第一个问题.(需要在embarcadero.com上发布很长一段时间后再次检查)

问题2:

我可以安全地说只有1个资源的信号量与互斥锁具有相同的行为吗?

1 个回答
  • 正在使用所有资源,并且新线程会询问不可用的资源.由于它在synchronized函数内部等待,因此使用资源的其他线程无法释放资源,因为freeResource函数也被同步,并且由于等待线程已经取得对象级别锁定,它们无法进入该函数ResourceGovernor

    你已经错过了通话的事实wait()放弃监视器,以便其他同步代码能够执行.来自以下文档wait():

    当前线程必须拥有此对象的监视器.线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象的监视器上的线程唤醒.然后线程等待,直到它可以重新获得监视器的所有权并继续执行.

    对于你的第二个问题:

    我可以安全地说只有1个资源的信号量与互斥锁具有相同的行为吗?

    我怀疑是这样,虽然你所展示的实现并没有让你freeResource多次停止呼叫.这是在一个有点奇怪的实现我通常看到信号灯计算资源的数量剩余,而不是资源的数量采取的 -尽管他们是等价的,当然.

    2023-02-13 14:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有