iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#怎么使用LOCK实现线程同步
  • 108
分享到

C#怎么使用LOCK实现线程同步

2023-06-30 06:06:23 108人浏览 八月长安
摘要

本篇内容介绍了“C#怎么使用LOCK实现线程同步”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介线程安全概念:线程安全是指在当一个线程

本篇内容介绍了“C#怎么使用LOCK实现线程同步”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、简介

线程安全概念:线程安全是指在当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。

二、代码

下面将通过简单的四个案例进行对比,来讲解LOCK的实现线程同步使用。

案例一:

首先创建两个线程,两个线程执行同一个方法,代码如下:

class Program    {        static void Main(string[] args)        {            Thread threadA = new Thread(ThreadMethod); //执行的必须是无返回值的方法             threadA.Name = "threadA";            Thread threadB = new Thread(ThreadMethod); //执行的必须是无返回值的方法             threadB.Name = "threadB";            threadA.Start();            threadB.Start();            Console.ReadKey();        }        public static void ThreadMethod(object parameter)        {            for (int i = 1; i <= 10; i++)            {                Console.WriteLine("我是:{0},我循環{1}次", Thread.CurrentThread.Name, i);                Thread.Sleep(1000);//休眠一秒            }        }    }

通过下面的执行结果,可以很清楚的看到,两个线程是在同时执行ThreadMethod这个方法,这显然不符合我们线程同步的要求。

执行结果:

C#怎么使用LOCK实现线程同步

案例二:

通过对上面代码的修改如下:

class Program    {        static void Main(string[] args)        {            Program pro = new Program();            Thread threadA = new Thread(pro.ThreadMethod);             threadA.Name = "threadA";            Thread threadB = new Thread(pro.ThreadMethod);             threadB.Name = "threadB";            threadA.Start();            threadB.Start();            Console.ReadKey();        }        public void ThreadMethod(object parameter)        {            lock (this) //添加lock关键字            {                for (int i = 1; i <= 10; i++)                {                    Console.WriteLine("我是:{0},我循環{1}次", Thread.CurrentThread.Name, i);                    Thread.Sleep(1000);//休眠一秒                }            }        }    }

执行结果:

C#怎么使用LOCK实现线程同步

我们通过添加了 lock(this) {...}代码,查看执行结果实现了我们想要的线程同步需求。

案例三:

但是我们知道this表示当前类实例的本身,那么有这么一种情况,我们把需要访问的方法所在的类型进行两个实例A和B,线程A访问实例A的方法ThreadMethod,线程B访问实例B的方法ThreadMethod,这样的话还能够达到线程同步的需求吗?

修改后的代码如下:

class Program    {        static void Main(string[] args)        {            Program pro1 = new Program();            Program pro2 = new Program();            Thread threadA = new Thread(pro1.ThreadMethod);             threadA.Name = "threadA";            Thread threadB = new Thread(pro2.ThreadMethod);             threadB.Name = "threadB";            threadA.Start();            threadB.Start();            Console.ReadKey();        }        public void ThreadMethod(object parameter)        {            lock (this) //添加lock关键字            {                for (int i = 1; i <= 10; i++)                {                    Console.WriteLine("我是:{0},我循環{1}次", Thread.CurrentThread.Name, i);                    Thread.Sleep(1000);//休眠一秒                }            }        }    }

执行结果:

C#怎么使用LOCK实现线程同步

我们会发现,线程又没有实现同步了!lock(this)对于这种情况是不行的!

案例四:

通过对上面代码再次进行如下修改:

class Program    {        private static object obj = new object();        static void Main(string[] args)        {            Program pro1 = new Program();            Program pro2 = new Program();            Thread threadA = new Thread(pro1.ThreadMethod);             threadA.Name = "threadA";            Thread threadB = new Thread(pro2.ThreadMethod);             threadB.Name = "threadB";            threadA.Start();            threadB.Start();            Console.ReadKey();        }        public void ThreadMethod(object parameter)        {            lock (obj) //添加lock关键字            {                for (int i = 1; i <= 10; i++)                {                    Console.WriteLine("我是:{0},我循環{1}次", Thread.CurrentThread.Name, i);                    Thread.Sleep(1000);//休眠一秒                }            }        }    }

执行结果:

C#怎么使用LOCK实现线程同步

通过查看执行结果。会发现代码实现了我们的需求。

那么 lock(this) 和lock(Obj)有什么区别呢?

lock(this) 定 当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对其它类实例无影响。所有不推荐使用。
lock(typeof(Model))锁定的是model类的所有实例。
lock(obj)锁定的对象是全局的私有化静态变量。外部无法对该变量进行访问。
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
所以,lock的结果好不好,还是关键看锁的谁,如果外边能对这个谁进行修改,lock就失去了作用。所以一般情况下,使用私有的、静态的并且是只读的对象

“C#怎么使用LOCK实现线程同步”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C#怎么使用LOCK实现线程同步

本文链接: https://www.lsjlt.com/news/327578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#怎么使用LOCK实现线程同步
    本篇内容介绍了“C#怎么使用LOCK实现线程同步”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介线程安全概念:线程安全是指在当一个线程...
    99+
    2023-06-30
  • C#使用LOCK实现线程同步
    一、简介 线程安全概念:线程安全是指在当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程有可能和...
    99+
    2024-04-02
  • C#怎么使用Monitor类实现线程同步
    这篇文章主要讲解了“C#怎么使用Monitor类实现线程同步”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么使用Monitor类实现线程同步”吧!一、简介Lock关键字是Monitor...
    99+
    2023-06-30
  • C#使用Monitor类实现线程同步
    一、简介 Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor.  lock (obj) { //代码...
    99+
    2024-04-02
  • C#中怎么实现同步线程
    C#中怎么实现同步线程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#同步线程在C#同步线程方面,C#提供了几种方法。在上述计算平方的例子中,需要与执行计算的C#同步线程,以...
    99+
    2023-06-17
  • Python并行编程多线程锁机制Lock与RLock实现线程同步
    目录什么是锁机制?Lock() 管理线程RLock() 与Lock()的区别什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制。前面我们谈到一个进程内的多个线程的某些资...
    99+
    2024-04-02
  • C++ 如何实现多线程与线程同步
    目录CreateThread 实现多线程:beginthreadex 实现多线程:CreateMutex 互斥锁实现线程同步:通过临界区实现线程同步:Semaphore 基于信号实现...
    99+
    2024-04-02
  • C#多线程中lock怎么用
    这篇文章主要介绍了C#多线程中lock怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。下面就是一段简单的代码。public class AccessC...
    99+
    2023-06-17
  • Python中怎么实现线程同步
    这篇文章主要介绍“Python中怎么实现线程同步”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中怎么实现线程同步”文章能帮助大家解决问题。使用 Thread 对象的 Lock 和 Rlo...
    99+
    2023-06-27
  • Java中怎么实现多线程同步
    今天就跟大家聊聊有关Java中怎么实现多线程同步,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。让我们从JVM的角度来看看锁这个概念:在Java程序运行时环境中,JVM需要对两类线程共...
    99+
    2023-06-17
  • python中怎么实现threading线程同步
    小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明threading模块具有实现锁定的内置功能,允许同步线程。为了防止数据损坏或丢失,需要锁定来控制共享资源...
    99+
    2023-06-20
  • C#多线程锁lock和Monitor怎么用
    本文小编为大家详细介绍“C#多线程锁lock和Monitor怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程锁lock和Monitor怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1,Loc...
    99+
    2023-06-29
  • 怎么使用rsync实现远程同步
    这篇文章主要为大家展示了“怎么使用rsync实现远程同步”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用rsync实现远程同步”这篇文章吧。rsync是可以实现增量备份的工具。配合任务计划...
    99+
    2023-06-28
  • Java中怎么利用Synchronized实现多线程同步
    这期内容当中小编将会给大家带来有关Java中怎么利用Synchronized实现多线程同步,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用同步的原因 在系统中对访类要使用多线程进行访问; 在该类中有 类...
    99+
    2023-06-17
  • Android中怎么利用同步锁实现多线程
    Android中怎么利用同步锁实现多线程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、同步机制关键字synchronized 对于Java来说,最常用的同步机制就是sync...
    99+
    2023-05-30
    android
  • python中Event怎么实现线程间同步
    这篇文章主要介绍“python中Event怎么实现线程间同步”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中Event怎么实现线程间同步”文章能帮助大家解决问题。前言:Event在pyt...
    99+
    2023-06-29
  • C#如何使用多线程中的lock
    小编给大家分享一下C#如何使用多线程中的lock,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于...
    99+
    2023-06-17
  • Java如何实现多线程、线程同步
    这篇文章主要介绍了Java如何实现多线程、线程同步的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java如何实现多线程、线程同步文章都会有所收获,下面我们一起来看看吧。1 多线程1.1 进程进程:是正在运行的程...
    99+
    2023-06-30
  • Java中怎样实现多线程同步
    本篇文章给大家分享的是有关Java中怎样实现多线程同步,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。不同步时的代码Bank.java  package&nb...
    99+
    2023-06-17
  • 利用Java如何实现同步线程
    利用Java如何实现同步线程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点...
    99+
    2023-05-31
    java 线程 线程同步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作