C#多线程锁「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。
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
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152045.html原文链接:https://javaforall.cn
相关文章
- C#多线程
- c# 递归算法
- C#多线程同步事件及等待句柄
- C# 多线程 ThreadStart和ParameterizedThreadStart
- c# openfiledialog如何使用_其在古文中的用法
- C#-split函数的使用
- C#多线程调试
- C# 多线程与线程扫描器
- C#多线程的几种实现方法详解编程语言
- C#多线程Singleton(单件)模式模板
- c#设置xml内容不换行及属性xsi:nil=true的空节点添加
- 浅解关于C#多线程的介绍
- 浅析C#web访问mysql数据库-整理归纳总结
- c#多线程网络聊天程序代码分享(服务器端和客户端)
- c#多线程的应用全面解析
- c#程序定期把内存信息记录到log日志示例
- 基于C#实现一个最简单的HTTP服务器实例
- C#中Winform窗体Form的关闭按钮变灰色的方法
- C#使用ping命令的两个例子