大家好,又见面了,我是你们的朋友全栈君。
C#开发中会常遇到多线程的问题,当多个线程同时对同一个资源进行操作时,就需要注意线程同步的问题。线程如果不同步,可能会造成与预计不同的结果,这时就要对资源进行上锁。当多个线程操作一个全局变量时,如果对全局变量进行上锁,则当一个线程访问这个全局变量时,另一个线程并不能去访问这个全局变量,只有等解锁资源后,其余线程才有机会去访问。这就保证了线程同步。下面是示例:
两个线程fun1和fun2同时对队列进行入队操作,当入队数量比较小时,可能没有问题,当数量较大时,会发现队列中元素个数并不是两个线程入队元素的和。
public class student
{
public int age;
public string name;
public int num;
}
Queue<student> q= new Queue<student>();
public void fun1()
{
Monitor.Enter(this);//锁定,保持同步
student s = new student();
for (int i = 0; i < 2000000; i++)
{
s.num = 1;
s.age = i;
s.name = "A" + i.ToString();
q.Enqueue(s);
}
Monitor.Exit(this);//取消锁定
}
public void test_queue_nolock()
{
Thread t1= new Thread(new ThreadStart(fun1));
t1.Name="线程1";
t1.Start();
Thread t2 = new Thread(new ThreadStart(fun1));
t2.Name = "线程2";
t2.Start();
}
private void btn_test_Click(object sender, EventArgs e)
{
test_queue_nolock();
timer_dequeue.Enabled = true;
}
private void timer_queue_Tick(object sender, EventArgs e)
{
Console.WriteLine("队列写入了{0}条数据", q.Count);
}
其中线程的启动为:
1)不带参数的启动:Thread t1= new Thread(new ThreadStart(fun1));
然后再 t1.start()开启该线程
2)带参数的启动方法,就要使用ParameterizedThreadStart委托来实例化Thread了,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化ThreadStart时所用到的方法是没有参数的。ParameterizedThreadStart定义为:
public delegate void ParameterizedThreadStart(object obj);
Thread t1= new Thread(new ThreadStart(fun1));
t1.start(100);此时的fun1应该有一个object 参数
具体可参考:http://blog.csdn.net/zhoufoxcn/article/details/4402999
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152045.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...