这篇文章介绍了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#多线程之线程同步
基础教程推荐
猜你喜欢
- C# windows语音识别与朗读实例 2023-04-27
- C# List实现行转列的通用方案 2022-11-02
- C#类和结构详解 2023-05-30
- winform把Office转成PDF文件 2023-06-14
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- C#控制台实现飞行棋小游戏 2023-04-22
- unity实现动态排行榜 2023-04-27
- C# 调用WebService的方法 2023-03-09
- 一个读写csv文件的C#类 2022-11-06