|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。念头
从入手下手打仗多线(进)程编程模子入手下手,进修的就是和旌旗灯号量(Semaphore)相干的同步原语。不晓得为何.NetFramework里却没有响应的东东。要命的是,我之前有良多久经磨练的C++代码都是用她来完成的,为了不使反动先烈的药白吃,血白流,只好本人生一个了。
甚么是旌旗灯号量(Semaphore)
假如你已懂得旌旗灯号量(Semaphore)的观点了,请跳过这一段。
旌旗灯号量(Semaphore)是在多线程情况下利用的一种举措措施,它卖力和谐各个线程,以包管它们可以准确、公道的利用大众资本。
我们来看看一个泊车场是如何运作的。为了复杂起见,假定泊车场只要三个车位,一入手下手三个车位都是空的。这是假如同时来了五辆车,看门人同意个中三辆不受拦阻的进进,然后放下车拦,剩下的车则必需在出口守候,今后来的车也都不能不在出口处守候。这时候,有一辆车分开泊车场,看门人得知后,翻开车拦,放进一辆,假如又分开两辆,则又能够放进两辆,云云来去。
在这个泊车场体系中,车位是大众资本,每辆车比如一个线程,看门人起的就是旌旗灯号量的感化。
更进一步,旌旗灯号量的特征以下:旌旗灯号量是一个非负整数(车位数),一切经由过程它的线程(车辆)城市将该整数减一(经由过程它固然是为了利用资本),当该整数值为零时,一切试图经由过程它的线程都将处于守候形态。在旌旗灯号量上我们界说两种操纵:Wait(守候)和Release(开释)。当一个线程挪用Wait守候)操纵时,它要末经由过程然后将旌旗灯号量减一,要末一自等下往,直到旌旗灯号量年夜于一或超时。Release(开释)实践上是在旌旗灯号量上实行加操纵,对应于车辆分开泊车场,该操纵之以是叫做“开释”是应为加操纵实践上是开释了由旌旗灯号量保卫的资本。
完成
人人都晓得,.NetFramework类库中供应的线程同步举措措施包含:
Monitor,AutoResetEvent,ManualResetEvent,Mutex,ReadWriteLock和InterLock。个中AutoResetEvent,ManualResetEvent,Mutex派生自WaitHandler,它们实践上是封装了操纵体系供应的内查对象。而别的的应该是在.Net假造机中土生土长的。明显来自操纵体系内查对象的举措措施利用起来效力要差一些。不外效力并非我们这里要思索的成绩,我们将利用两个Monitor和一个ManualResetEvent工具来摹拟一个旌旗灯号量。
代码以下:
publicclassSemaphore
{
privateManualResetEventwaitEvent=newManualResetEvent(false);
privateobjectsyncObjWait=newobject();
privateintmaxCount=1;file://最年夜资本数
privateintcurrentCount=0;file://以后资本数
publicSemaphore()
{
}
publicSemaphore(intmaxCount)
{
this.maxCount=maxCount;
}
publicboolWait()
{
lock(syncObjWait)file://只能一个线程进进上面代码
{
boolwaitResult=this.waitEvent.WaitOne();file://在此守候资本数年夜于零
if(waitResult)
{
lock(this)
{
if(currentCount>0)
{
currentCount--;
if(currentCount==0)
{
this.waitEvent.Reset();
}
}
else
{
System.Diagnostics.Debug.Assert(false,"Semaphoreisnotallowcurrentcount<0");
}
}
}
returnwaitResult;
}
}
/**////<summary>
///同意超时前往的Wait操纵
///</summary>
///<paramname="millisecondsTimeout"></param>
///<returns></returns>
publicboolWait(intmillisecondsTimeout)
{
lock(syncObjWait)//Monitor确保该局限类代码在临界区内
{
boolwaitResult=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,"Semaphoreisnotallowcurrentcount<0");
}
}
}
returnwaitResult;
}
}
publicboolRelease()
{
lock(this)//Monitor确保该局限类代码在临界区内
{
currentCount++;
if(currentCount>this.maxCount)
{
currentCount=this.maxCount;
returnfalse;
}
this.waitEvent.Set();file://同意挪用Wait的线程进进
}
returntrue;
}
}
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。 |
|