.NET线程同步(1)
2024-07-10 13:00:19
供稿:网友
在处理.net线程同步问题,有许多办法,这里所将谈到的是特定代码区的同步.
这些特定的代码区是方法中重要的代码段,他们可以改变对象的状态,或者更新另一个资源.
monitor类用于同步代码去,其方式是使用monitor.enter()方法获得一个锁,然后使用monitor.exit()方法释放该锁.
示例如下:
using system;
using system.threading;
namespace enterexit
{
public class enterexit
{
private int result=0;
public enterexit()
{
}
public void noncriticalsection()
{
console.writeline("enter threah"+thread.currentthread.gethashcode());
for(int i=1;i<=5;i++)
{
console.writeline("result="+result++ +" threadid"+thread.currentthread.gethashcode());
thread.sleep(1000);
}
console.writeline("exiting threah"+thread.currentthread.gethashcode());
}
public void criticalsection()
{
monitor.enter(this);
console.writeline("enter threah"+thread.currentthread.gethashcode());
for(int i=1;i<=5;i++)
{
console.writeline("result="+result++ +" threadid"+thread.currentthread.gethashcode());
thread.sleep(1000);
}
console.writeline("exiting threah"+thread.currentthread.gethashcode());
monitor.exit(this);
}
public static void main(string[] args)
{
enterexit e=new enterexit();
if(args.length>0)
{
thread nt1=new thread(new threadstart(e.noncriticalsection));
nt1.start();
thread nt2=new thread(new threadstart(e.noncriticalsection));
nt2.start();
}
else
{
thread ct1=new thread(new threadstart(e.criticalsection));
ct1.start();
thread ct2=new thread(new threadstart(e.criticalsection));
ct2.start();
}
}
}
}
运行结果:
enter threah 1
result=0 thread1
result=1 thread1
result=2 thread1
result=3 thread1
result=4 thread1
exiting thread1
enter threah 2
result=5 thread2
result=6 thread2
result=7 thread2
result=8 thread2
result=9 thread2
exiting thread2