上面代码中有二处bug导致你的想法没有实现
1:锁的一致性没有保证,类ThreadObject中同步代码块中用的锁是当前类的实例,但你在monitor.pulse(newThread)中使用的锁是newThread,二者没有保持一致性,本身就是矛盾的。
2:monitor.pulse()方法必须从同步的代码块内调用。即放在monitor.enter() 与 monitor.exit() 之间调用。修改后的代码,供参考:
using System;
using System.Threading;class Lock
{}class ThreadObject
{
Lock mlock;
public ThreadObject(Lock _lock)
{
mlock=_lock;
}
public void F()
{
lock (this)
{
Console.WriteLine("Thread is working");
Console.WriteLine("Monitor.Wait()");
Monitor.Wait(this);
Console.WriteLine("after Wait");
}
}
}
class testM
{
public static void Main()
{
Lock mlock = new Lock();
ThreadObject Tobject = new ThreadObject(mlock);
Thread newThread = new Thread(new ThreadStart(Tobject.F));
newThread.Start();
while (!newThread.IsAlive) ;
Console.WriteLine(newThread.ThreadState);
Console.WriteLine("Monitor.Pulse after 3s"); Thread.Sleep(3000);
Monitor.Enter(mlock);
Monitor.Pulse(mlock);
Monitor.Exit(mlock);
Console.WriteLine("End"); Console.Read();
}
}
1:锁的一致性没有保证,类ThreadObject中同步代码块中用的锁是当前类的实例,但你在monitor.pulse(newThread)中使用的锁是newThread,二者没有保持一致性,本身就是矛盾的。
2:monitor.pulse()方法必须从同步的代码块内调用。即放在monitor.enter() 与 monitor.exit() 之间调用。修改后的代码,供参考:
using System;
using System.Threading;class Lock
{}class ThreadObject
{
Lock mlock;
public ThreadObject(Lock _lock)
{
mlock=_lock;
}
public void F()
{
lock (this)
{
Console.WriteLine("Thread is working");
Console.WriteLine("Monitor.Wait()");
Monitor.Wait(this);
Console.WriteLine("after Wait");
}
}
}
class testM
{
public static void Main()
{
Lock mlock = new Lock();
ThreadObject Tobject = new ThreadObject(mlock);
Thread newThread = new Thread(new ThreadStart(Tobject.F));
newThread.Start();
while (!newThread.IsAlive) ;
Console.WriteLine(newThread.ThreadState);
Console.WriteLine("Monitor.Pulse after 3s"); Thread.Sleep(3000);
Monitor.Enter(mlock);
Monitor.Pulse(mlock);
Monitor.Exit(mlock);
Console.WriteLine("End"); Console.Read();
}
}
解决方案 »
- GDI: drawline怎么划线在屏幕最前方(实现在panel的范围内画一条线,panel上有若干控件了label,textbox等等)?
- 求正则表达式:非常的急,谢谢!
- MDI父子窗体问题,急!急!急!
- 我用FileInfo建立了一个.txt,建完后用StreamReader来读,为什么说另一个进程在使用该文件?
- 求水晶报表的部署问题,在线等
- ASP.NET之DropDownList请教(急救!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
- excel导入到SQL问题
- tcplistener 的监听地址问题
- 各位看看,帮下忙
- 应用程序无法正常启动(0xc000007b)
- 自定义的类中包含了pictureBox怎么让他显示?急
- 请问谁有asp.net+sql2000的对文件(.doc,excel)导入导出的源代码?
using System.Threading;class Lock
{}class ThreadObject
{
Lock mlock;
public ThreadObject(Lock _lock)
{
mlock=_lock;
}
public void F()
{
lock (mlock)
{
Console.WriteLine("Thread is working");
Console.WriteLine("Monitor.Wait()");
Monitor.Wait(mlock);
Console.WriteLine("after Wait");
}
}
}
class testM
{
public static void Main()
{
Lock mlock = new Lock();
ThreadObject Tobject = new ThreadObject(mlock);
Thread newThread = new Thread(new ThreadStart(Tobject.F));
newThread.Start();
while (!newThread.IsAlive) ;
Console.WriteLine(newThread.ThreadState);
Console.WriteLine("Monitor.Pulse after 3s"); Thread.Sleep(3000);
Monitor.Enter(mlock);
Monitor.Pulse(mlock);
Monitor.Exit(mlock);
Console.WriteLine("End"); Console.Read();
}
}上面的传错了