博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WaitHandle——使用Semaphore
阅读量:6893 次
发布时间:2019-06-27

本文共 1077 字,大约阅读时间需要 3 分钟。

    semaphore也继承自waithandle,它用于锁机制,与Mutex不同的是,它允许指定数量的线程同时访问资源,在线程超过数量以后,则进行排队等待,直到之前的线程退出。

    Semaphore很适合应用于web服务器这样的高并发场景,可以限制对资源访问的线程数。

    Monitor与monitor都有一个锁持有者,而semaphore则不需要,因此通常将sempahore声明为静态的。

 

   来看下面的示例:

namespace 使用Semaphore{    class Program    {         //第一个参数指定当前运行多少条线程进入,第二个参数表示 允许多少个线程同时进入        static Semaphore sem = new Semaphore(2, 2);         static void Main(string[] args)        {            for (int i = 1; i <=4; i++)            {                new Thread (ThreadEntry).Start (i);            }        }         static void ThreadEntry(object id) {            Console.WriteLine("thread {0} wants to get in",id);            sem.WaitOne();  //在调用waitone方法时,如果有空位,则占位;如果没有,则等待;            Console.WriteLine("thread {0} gets in",id );            Thread.Sleep(100);            Console.WriteLine("thread {0} is leaving",id );            sem.Release();  //释放一个空位;                }    }}

调用结果:

 

     设想下,如果有一个抢票的页面,所有人同一时刻并发访问,可以用此对象设置好并发的人数和同时可以有多少人进入等待状态。其他人可以排到一个队列中,如果队列过长的话,会造成服务器内存消耗过多,这时,可以采用分布式的方法,把队列分配到不同的主机上,减轻服务器压力。

   以上设想还未在实践中使用过,但是学习了两天如何处理高并发问题,这也算是理出来的一个思路吧。

你可能感兴趣的文章
Linux内核线程
查看>>
yarn和cnpm 配置
查看>>
第四题小案例3
查看>>
设计模式-策略模式
查看>>
Ubuntu 下Rsync配置及使用
查看>>
ipad开发需要投入更多的精力
查看>>
Linux服务器性能评估与优化
查看>>
C#往文件中追加文本内容信息
查看>>
让Openwrt在U盘运行
查看>>
openwrt交叉编译环境
查看>>
金蝶kis记账王管理用户权限的方法
查看>>
分布式设计与开发(二)------几种必须了解的分布式算法
查看>>
JS中typeof与instanceof的区别
查看>>
PHP中str_replace函数使用小结
查看>>
Oracle用户、角色、授权和表空间
查看>>
linux下修改SWAP空间大小
查看>>
我的友情链接
查看>>
mac 安装python3.4、django
查看>>
你想建设一个能承受500万PV/每天的网站吗?如果计算呢?
查看>>
iOS8完美越狱在路上了吗?
查看>>