C#构建多线程应用程序(4) —— 并发问题
2016-02-17 10:39
549 查看
在构建多线程的应用程序时,我们需要找到一种方式来控制多个线程对共享资源的同步访问。System.Threading命名空间提供了一些以同步为中心的类型。C#编程语言也提供了一个特别的关键字,它能在多线程程序中同步共享数据。
同步访问共享资源的首选技术是C#的lock关键字。这个关键字允许定义一段线程同步的代码语句。Lock关键字需要定义一个标记,即一个对象引用,线程在进入锁定范围的时候必须获得这个标记。
如果需要锁定安全成员中的一段代码,比较安全的方式是声明私有的object成员来作为锁标记。一旦一个线程进入锁定范围,在它退出锁定范围且释放锁定之前,其他线程将无法访问锁定标记。因此,如果线程A获得锁定标记,直到它放弃这个锁定标记,其他线程才能进入锁定范围。
下面显示了使用lock关键字来实现线程同步的示例代码:
运行结果如下:
public static void Printer()
{
Monitor.Enter(threadLock);
for (int i = 1; i < 11; i++)
{
if (i % 10 != 0)
{
Console.WriteLine("thread {0} output the number:{1}.", Thread.CurrentThread.ManagedThreadId, number++);
}
}
Monitor.Exit(threadLock);
}
使用Monitor类型还可以使用Monitor.Wait()方法指示活动的线程等待一段时间,在当前线程完成操作时,通知等待线程。
使用C#的lock关键字实现线程同步
如果需要锁定安全成员中的一段代码,比较安全的方式是声明私有的object成员来作为锁标记。一旦一个线程进入锁定范围,在它退出锁定范围且释放锁定之前,其他线程将无法访问锁定标记。因此,如果线程A获得锁定标记,直到它放弃这个锁定标记,其他线程才能进入锁定范围。
下面显示了使用lock关键字来实现线程同步的示例代码:
<span style="font-size:14px;">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace MultiThread { class Program { public static object threadLock = new object(); public static int number = 1; public static void Printer() { lock (threadLock) { for (int i = 1; i < 11; i++) { if (i % 10 != 0) { Console.WriteLine("thread {0} output the number:{1}.", Thread.CurrentThread.ManagedThreadId, number++); } } } } static void Main(string[] args) { //创建线程 Thread SleepThread1 = new Thread(new ThreadStart(Printer)); Thread SleepThread2 = new Thread(new ThreadStart(Printer)); //启动线程 SleepThread1.Start(); SleepThread2.Start(); Console.WriteLine("the sleep thread is over!"); Console.ReadLine(); } } }</span>
运行结果如下:
使用System.Threading.Monitor类型进行同步
大多数情况下,使用lock关键字就够用了,但System.Threading.Monitor类型比lock关键字有更好的控制力。public static void Printer()
{
Monitor.Enter(threadLock);
for (int i = 1; i < 11; i++)
{
if (i % 10 != 0)
{
Console.WriteLine("thread {0} output the number:{1}.", Thread.CurrentThread.ManagedThreadId, number++);
}
}
Monitor.Exit(threadLock);
}
使用Monitor类型还可以使用Monitor.Wait()方法指示活动的线程等待一段时间,在当前线程完成操作时,通知等待线程。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- tomcat配置调优记录