c#中线程安全-记录
在C#中,值类型的数据不会产生线程不安全。这是因为值类型的数据在内存中是按值存储的,
每个线程都有自己的栈空间,因此不会出现多个线程同时访问同一个内存地址的情况。
而引用类型的数据则是按引用存储的,多个线程可能会同时访问同一个内存地址,从而导致线程不安全的问题。为了避免这种情况,
可以使用锁或其他同步机制来保证线程安全。
Random.Shared是C# 6.0中引入的一个静态属性,它返回一个线程安全的Random实例。
它的实现原理是使用ThreadLocal<T>类型来创建一个Random实例,每个线程都有自己的Random实例,
避免了多线程竞争的问题。同时,Random.Shared使用了一个种子生成器来生成种子,
这个种子生成器是基于时间和进程ID的,保证了每个Random实例的种子都是不同的。
using System; using System.Security.Cryptography; using System.Threading; class ThreadTest { //static Random random = Random.Shared ;//new Random(); static ThreadLocal<Random> random = new ThreadLocal<Random>(() => new Random()); public static void Show() { Thread thread1 = new Thread(GenerateRandomNumbers); Thread thread2 = new Thread(GenerateRandomNumbers2); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } static void GenerateRandomNumbers() { for (int i = 0; i < 15; i++) { Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} " + $"generated random number: {random.Value.Next()}"); Thread.Sleep(100); } } static void GenerateRandomNumbers2() { for (int i = 0; i < 15; i++) { Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} " + $"generated random number: {random.Value.NextDouble()}"); Thread.Sleep(100); } } }
输出结果:
Thread 5 generated random number: 241586930 Thread 6 generated random number: 0.8030386416058318 Thread 5 generated random number: 172262562 Thread 6 generated random number: 0.9369358475444122 Thread 6 generated random number: 0.17967850327526647 Thread 5 generated random number: 774804563 Thread 5 generated random number: 107769505
两个线程是互不干扰的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix