WaitHandle――使用Semaphore
來源:程序員人生 發布時間:2015-01-24 08:42:22 閱讀次數:3189次
semaphore也繼承自waithandle,它用于鎖機制,與Mutex不同的是,它允許指定數量的線程同時訪問資源,在線程超過數量以后,則進行排隊等待,直到之前的線程退出。
Semaphore很合適利用于web服務器這樣的高并發場景,可以限制對資源訪問的線程數。
Monitor與monitor都有1個鎖持有者,而semaphore則不需要,因此通常將sempahore聲明為靜態的。
來看下面的示例:
namespace 使用Semaphore
{
class Program
{
//第1個參數指定當前運行多少條線程進入,第2個參數表示 允許多少個線程同時進入
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(); //釋放1個空位;
}
}
}
調用結果:

假想下,如果有1個搶票的頁面,所有人同1時刻并發訪問,可以用此對象設置好并發的人數和同時可以有多少人進入等待狀態。其他人可以排到1個隊列中,如果隊列太長的話,會造成服務器內存消耗過量,這時候,可以采取散布式的方法,把隊列分配到不同的主機上,減輕服務器壓力。
以上假想還未在實踐中使用過,但是學習了兩天如何處理高并提問題,這也算是理出來的1個思路吧。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈