class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;
public static MessageProcessor(ClientContent content)
{
if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;
//在这里做整理用户集合的事情.
}
switch(content.head)
{
case "onli":
break;
case "ofli":
break;
}
}
}
这个静态方法会被很多线程调用。
比如:
Thread t1=new Thread(new ThreadStart(work))
Thread t2=new Thread(new ThreadStart(work))
Thread t3=new Thread(new ThreadStart(work))
..... 等会很多。
void work()
{
while(true)
{
ClientContent c=new ClientContent()
MessageCenter.MessageProcessor(c) //A
Thread.sleep(2000);
}
}
这里模防每个线程会5秒钟调用//A这静太方法。
问题1?
目的:
不管是谁在调用这个静太方法,当他发现,现在的时间_his大于2分钟后,
就在自己的线程内,维护这个用户队列,也就是整理一次Users,其他都不用了。
我上面的方法显然是不行的,可能会发生几个线程同时进入,都去做这个维护工作
经过测试的确如此。
我断定问题是发生在这句子if(DataTime.now>=_his.addMM(2)) 当一个线程得到真结果后
还没有 _his=DataTime.now; 重新设置这个值。
另外一个线程己经也得到了if(DataTime.now>=_his.addMM(2))的true结果。
代码改进
class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;
static object lo=new object();
public static MessageProcessor(ClientContent content)
{
lock(lo)
{
if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;
//在这里做整理用户集合的事情.
}
}
switch(content.head)
{
case "onli":
break;
case "ofli":
break;
}
}
}
现求更高效的做法。