WaitHandle――使用Semaphore
來源:程序員人生 發(fā)布時(shí)間:2015-01-24 08:42:22 閱讀次數(shù):3196次
semaphore也繼承自waithandle,它用于鎖機(jī)制,與Mutex不同的是,它允許指定數(shù)量的線程同時(shí)訪問資源,在線程超過數(shù)量以后,則進(jìn)行排隊(duì)等待,直到之前的線程退出。
Semaphore很合適利用于web服務(wù)器這樣的高并發(fā)場景,可以限制對資源訪問的線程數(shù)。
Monitor與monitor都有1個(gè)鎖持有者,而semaphore則不需要,因此通常將sempahore聲明為靜態(tài)的。
來看下面的示例:
namespace 使用Semaphore
{
class Program
{
//第1個(gè)參數(shù)指定當(dāng)前運(yùn)行多少條線程進(jìn)入,第2個(gè)參數(shù)表示 允許多少個(gè)線程同時(shí)進(jìn)入
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(); //在調(diào)用waitone方法時(shí),如果有空位,則占位;如果沒有,則等待;
Console.WriteLine("thread {0} gets in",id );
Thread.Sleep(100);
Console.WriteLine("thread {0} is leaving",id );
sem.Release(); //釋放1個(gè)空位;
}
}
}
調(diào)用結(jié)果:

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