初学多线程(一)--保护共享资源

初学者指南,介绍在多线程环境中保护共享资源的重要性,避免资源分配冲突。文章提到了两种保护方法,并特别讨论了Interlocked类在处理整型字段并发操作时的角色,如自增自减操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.共享资源未被保护,被多个线程并行访问,会发生资源分配上的冲突,两种方法保护共享资源
ps:共享资源像静态类中的字段,方法
How to protect shared resources from concurrent access?

1.使用 Interlocked.Increment(字段) 
  //在System.Threading
 class Program
    {
        static int total = 0;
        static void Main(string[] args)
        {
            Stopwatch sp = Stopwatch.StartNew();
            Thread t1 = new Thread(AddToMillion);
            Thread t2 = new Thread(AddToMillion);
            Thread t3 = new Thread(AddToMillion);
            t1.Start();
            t2.Start();
            t3.Start();
            t1.Join();
            t2.Join();
            t3.Join();
            Console.WriteLine("the total = " + total .ToString ());
            sp.Stop();
            Console.WriteLine("ticks = "+sp.ElapsedTicks);
        }
        static void AddToMillion()
        {
            for (int i = 0; i < 1000000; i++)
            {
                 Interlocked.Increment(total);
            }
        }
    }
   运行结果:the total = 30000
           ticks = 117078
2.使用lock对code session 进行锁定
//使用lock时要创建一个私有的静态object对象
 // private static object obj = new object();
 class Program
    {
        static int total = 0;
        static void Main(string[] args)
        {
            Stopwatch sp = Stopwatch.StartNew();
            Thread t1 = new Thread(AddToMillion);
            Thread t2 = new Thread(AddToMillion);
            Thread t3 = new Thread(AddToMillion);
            t1.Start();
            t2.Start();
            t3.Start();
            t1.Join();
            t2.Join();
            t3.Join();
            Console.WriteLine("the total = " + total .ToString ());
            sp.Stop();
            Console.WriteLine("ticks = "+ sp.ElapsedTicks);
        }
        static object obj = new object();
        static void AddToMillion()
        {
            for (int i = 0; i < 1000000; i++)
            {
                 lock(obj )
                 {
                     total++;
                 }
            }
        }
    }
运行结果:total= 3000000
        ticks = 334236    

2.Interlocked类只能对int/long类型的字段addition/subtraction(increment , decrement ,add etc),这个类包含自增自减的方法,所以Interlocked.Increment(total),中total不用写成total++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值