多线程同步问题解决方法之一---使用lock

本文通过一个C#线程同步示例,展示了如何在多线程环境中使用锁(lock)来保护共享状态,避免数据竞争,确保数据一致性。示例中创建了一个共享状态类,该类包含一个整型变量和一个用于同步的对象。通过在多个任务中调用共享状态的递增方法,演示了线程同步的重要性。

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

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Threading.Tasks;
   7:  
   8: namespace SynchronizationSamples
   9: {
  10:     public class SharedState
  11:     {
  12:         private int state = 0;
  13:         private object syncRoot = new object();
  14:         public int State 
  15:         { 
  16:             get{return state;}
  17:             set { state = value; }
  18:         }
  19:  
  20:         public int IncrementState()
  21:         {
  22:             lock (syncRoot)
  23:             {
  24:                 return ++state;
  25:             }
  26:             
  27:         }
  28:     }
  29:  
  30:     public class Job
  31:     {
  32:         SharedState sharedState;
  33:         public Job(SharedState sharedState)
  34:         {
  35:             this.sharedState = sharedState;
  36:         }
  37:  
  38:         public void DoTheJob()
  39:         {
  40:             for (int i = 0; i < 50000;i++ )
  41:             {
  42:                 lock (sharedState)
  43:                 {
  44:                     sharedState.State += 1;
  45:                 }
  46:             }
  47:         }
  48:     }
  49:     class Program
  50:     {
  51:         static void Main(string[] args)
  52:         {
  53:             int numTasks = 20;
  54:             var state = new SharedState();
  55:             var tasks = new Task[numTasks];
  56:  
  57:             for (int i = 0; i < numTasks; i++)
  58:             {
  59:                 tasks[i] = new Task(new Job(state).DoTheJob);
  60:                 tasks[i].Start();
  61:             }
  62:  
  63:             for (int i = 0; i < numTasks;i++ )
  64:             {
  65:                 tasks[i].Wait();
  66:             }
  67:             Console.WriteLine("summarized {0}",state.State);
  68:             Console.Read();
  69:         }
  70:     }
  71: }

转载于:https://www.cnblogs.com/jerry01/archive/2012/12/12/2708800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值