架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 33630|回复: 2

[资料] c# 线程安全 与 lock锁

[复制链接]
发表于 2016-6-13 17:26:25 | 显示全部楼层 |阅读模式

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
  线程安全问题都是由全局变量及静态变量引起的。
  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

lock的目的是防止多线程执行的时候出现并发操作问题,加上lock的引用类型的对象,在其锁定的区域内,在一个时刻只允许一个线程操作。

lock只能锁定一个引用类型变量,也就是锁定一个地址



  1. class Program

  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.         threda t=new threda();
  6.         threda.obj.i = 10;
  7.         Thread th1 = new Thread(new ThreadStart(t.hhh));
  8.         th1.Name = "th1";
  9.         th1.Start();

  10.         Thread th2 = new Thread(new ThreadStart(t.hhh));
  11.         th2.Name = "th2";
  12.         th2.Start();
  13.         }
  14.     }



  15. class threda
  16.     {
  17.         public static sss obj = new sss();

  18.         public void hhh()
  19.         {
  20.             lock (obj)
  21.             {
  22.                 for (int i = 0; i < 7; i++)
  23.                 {
  24.                     Thread.Sleep(500);
  25.                     
  26.                     if (obj.i >0)
  27.                     {
  28.                         obj.i--;
  29.                         Console.WriteLine("当前线程名:"+Thread.CurrentThread.Name+", obj.i= " + obj.i);
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.         
  35.     }

  36.     class sss
  37.     {
  38.        public int i ;
  39.     }

复制代码


加锁和不加锁运行的结果有区别 :

加锁后:i的值会一个个递减,不会出现跳跃,不会出现重复输出,一直到0值;

不加锁:i的值输出会出现跳跃,不连续递减,可能还会出现-1值输出;

原因:加锁后,一个时刻只能有一个线程执行被锁区域的代码,两个线程都是有先后顺序执行的,所以不会出现间断输出。




上一篇:User cancelled out of save dialogue (MS Visual Database Tools)
下一篇:一个不错的DBHelper类,可执行存储过程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2016-6-14 10:53:36 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-2-10 09:18:58 | 显示全部楼层
.NET/C# Lock 锁原理 Monitor 深入讲解
https://www.itsvse.com/thread-9633-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-7-18 11:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表