C#多线程锁
来源:互联网 发布:致胜轮毂数据 编辑:程序博客网 时间:2024/06/07 12:31
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
- C#多线程的锁
- c#多线程读写锁
- C#多线程锁
- c#多线程
- C#多线程
- C#多线程
- C#多线程
- C#多线程
- 多线程c#
- c#多线程
- c# 多线程
- C# 多线程
- C#多线程
- c# 多线程
- C#多线程
- C#多线程
- c#多线程
- C#多线程
- 大数据学习的各个阶段
- xutilsforhttputilsdemo
- 802.11 MAC层帧解析
- 改变数据库和表编码
- HDU-4991-Ordered Subsequence【树状数组】【动态规划】【好题】
- C#多线程锁
- HDU 2639 Bone Collector II(0-1背包第k优解)
- 比较两个数组间有什么不同
- Filter过滤器中访问getSession()要转化
- 使用 Docker 搭建 Java Web 运行环境
- 闭包
- NYOJ 169
- java进程、线程通信方法以及进程与线程的区别
- JDBC 第一篇