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

两个线程是互不干扰的。

posted @ 2023-05-12 11:30  vba是最好的语言  阅读(92)  评论(0编辑  收藏  举报