semaphore用法解析,semaphore的作用是什么?

TheDisguiser 2020-07-22 16:04:54 java常见问答 4497

semaphore小伙伴们听过吗?这是多线程下的一种设施,今天我们就来解析一下它的用法和它有哪些作用。

semaphore概念及作用

具体的说,它叫做信号量(Semaphore),俗称信号灯,是在多线程环境下使用的一种设施, 一般负责协调各个线程, 以保证它们能够正确、合理的来使用公共资源。

semaphore是一种新的同步类,是一个计数信号。

以概念来说的话,信号量维护了一个许可集合,如若有需要,在许可可用之前,它可以阻塞每一个acquire(),之后,再获取该许可。

在信号量中,每添加一个release()许可,就可能释放一个正在阻塞的获取者,但是,它不是用的实际许可对象,semaphore只对可用许可的号码进行计数,采取相应行动。

在java多线程中,信号量经常被使用在多线程代码里,较为典型的就是数据库连接池。

semaphore用法

示例:

public class Semaphore
{
    private ManualResetEvent waitEvent = new ManualResetEvent(false);
    private object syncObjWait = new object();
    private int maxCount = 1;
    file: //最大资源数
        private int currentCount = 0;
    file: //当前资源数
        public Semaphore()
        {}
    public Semaphore(int maxCount)
    {
        this.maxCount = maxCount;
    }
    public bool Wait()
    {
        lock(syncObjWait) file: //只能一个线程进入下面代码
            {
                bool waitResult = this.waitEvent.WaitOne();file: //在此等待资源数大于零
                    if (waitResult)
                    {
                        lock(this)
                        {
                            if (currentCount > 0)
                            {
                                currentCount--;
                                if (currentCount == 0)
                                {
                                    this.waitEvent.Reset();
                                }
                            }
                            else
                            {
                                System.Diagnostics.Debug.Assert(false, "Semaphore is not allow current count < 0");
                            }
                        }
                    }
                return waitResult;
            }
    }
    /**/ /// <summary>
    /// 允许超时返回的 Wait 操作
    /// </summary>
    /// <param name="millisecondsTimeout"></param>
    /// <returns></returns>
    public bool Wait(int millisecondsTimeout)
    {
        lock(syncObjWait) // Monitor 确保该范围类代码在临界区内
        {
            bool waitResult = this.waitEvent.WaitOne(millisecondsTimeout, false);
            if (waitResult)
            {
                lock(this)
                {
                    if (currentCount > 0)
                    {
                        currentCount--;
                        if (currentCount == 0)
                        {
                            this.waitEvent.Reset();
                        }
                    }
                    else
                    {
                        System.Diagnostics.Debug.Assert(false, "Semaphore is not allow current count < 0");
                    }
                }
            }
            return waitResult;
        }
    }
    public bool Release()
    {
        lock(this) // Monitor 确保该范围类代码在临界区内
        {
            currentCount++;
            if (currentCount > this.maxCount)
            {
                currentCount = this.maxCount;
                return false;
            }
            this.waitEvent.Set();
            file: //允许调用Wait的线程进入
        }
        return true;
    }
}

以上就是本篇文章的所有内容,对于一些java架构师知识还有什么迷惑的话,欢迎来到奇Q工具网了解详情。

推荐阅读:

java semaphore是什么?semaphore什么意思?