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
两个线程是互不干扰的。