C# 线程安全
2021/9/26 9:11:00
本文主要是介绍C# 线程安全,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
多个线程对同一资源的争夺,有可能出现线程不安全的现象。用lock
这种最简单的方式实现下。
一
直观的看下这种情况:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace ThreadSafetyDemo { class Program { [STAThread] static void Main() { Thread.CurrentThread.Name = "====主线程===="; Program prg = new Program(); Thread newThread = new Thread(new ThreadStart(prg.DoSomeWork)); newThread.Name = "**新线程:"; newThread.IsBackground = true; newThread.Start(); // 开始新线程 prg.DoSomeWork(); // 开始主线程 Console.ReadKey(); } // 放在外面作为成员变量,这样连个线程操纵的时候才能看出不一样。 private int counter = 0; private void DoSomeWork() { for (int i = 1; i < 11; i++) { counter += i; Console.WriteLine("{0}{1}", Thread.CurrentThread.Name, counter); } } } }
输出:
====主线程====1 ====主线程====4 ====主线程====7 ====主线程====11 ====主线程====16 ====主线程====22 ====主线程====29 **新线程:2 **新线程:39 **新线程:42 **新线程:46 **新线程:51 **新线程:57 **新线程:64 **新线程:72 **新线程:81 **新线程:91 ====主线程====37 ====主线程====100 ====主线程====110
每次的结果其实都不一样,这就是线程的不安全,多个线程操纵了同意资源。
二
保证线程安全,加一个lock
块。
private void DoSomeWork() { lock (this) { for (int i = 1; i < 11; i++) { counter += i; Console.WriteLine("{0}{1}", Thread.CurrentThread.Name, counter); } } }
这样就没问题,保证只有一个线程调用。
三
更优雅的方式写法:
增加命名空间using System.Runtime.CompilerServices;
。然后在函数前增加一个这样的标签就可以——[MethodImpl(MethodImplOptions.Synchronized)]
。
[MethodImpl(MethodImplOptions.Synchronized)] private void DoSomeWork() { for (int i = 1; i < 11; i++) { counter += i; Console.WriteLine("{0}{1}", Thread.CurrentThread.Name, counter); } }
这样子也可以,也是同样的效果。
这篇关于C# 线程安全的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#