这篇文章介绍了C#多线程之线程同步,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一、前言
我们先来看下面一个例子:
using System;
using System.Threading;
namespace ThreadSynchDemo
{
class Program
{
private static int Counter = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
Counter++;
Thread.Sleep(1);
}
});
t1.Start();
Thread t2 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
Counter++;
Thread.Sleep(1);
}
});
t2.Start();
Thread.Sleep(3000);
Console.WriteLine(Counter);
Console.ReadKey();
}
}
}
我们猜想一下程序的输出结果是多少?2000?我们运行程序看一下输出结果:
我们看到,程序最后输出的结果跟我们预测的完全不一样,这是什么原因呢?这就是由线程同步引起的问题。
线程同步问题:是解决多个线程同时操作一个资源的问题
。
在上面的例子中,t1和t2两个线程里面都是让变量Counter的值自增1,假设这时t1线程读取到Counter的值为200,可能t2线程执行非常快,t1线程读取Counter值的时候,t2线程已经把Counter的值改为了205,等t1线程执行完毕以后,Counter的值又被变为了201,这样就会出现线程同步的问题了。那么该如何解决这个问题呢?
二、解决线程同步问题
1、lock
解决线程同步问题最简单的是使用lock。lock可以解决多个线程同时操作一个资源引起的问题。lock是C#中的关键字,它要锁定一个资源,lock的特点是:同一时刻只能有一个线程进入lock的对象的范围,其它lock的线程都要等待。我们看下面优化后的代码:
using System;
using System.Threading;
namespace ThreadSynchDemo
{
class Program
{
private static int Counter = 0;
// 定义一个locker对象
private static Object locker = new Object();
static void Main(string[] args)
{
#region 存在线程同步问题
//Thread t1 = new Thread(() => {
// for (int i = 0; i < 1000; i++)
// {
// Counter++;
// Thread.Sleep(1);
// }
/
沃梦达教程
本文标题为:C#多线程之线程同步
猜你喜欢
- Unity3D实现渐变颜色效果 2023-01-16
- user32.dll 函数说明小结 2022-12-26
- c# 模拟线性回归的示例 2023-03-14
- Unity Shader实现模糊效果 2023-04-27
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- Oracle中for循环的使用方法 2023-07-04
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- .NET CORE DI 依赖注入 2023-09-27
- 如何使用C# 捕获进程输出 2023-03-10