当前位置: 首页 > 编程语言 > C#

lock()语句会阻塞process-appdomain中的所有线程吗?分享

时间:2023-04-10 19:27:16 C#

lock()语句会阻塞process/appdomain中的所有线程?也许这个问题听起来很愚蠢,但我对线程和锁定不了解,我想得到确认(这就是我问的原因)。因此,如果我有10台服务器并且同时有10个请求到达每个服务器,那么整个服务器场就有100个请求。没有锁定,这是对数据库的100个请求。如果我这样做:privatestaticreadonlyobjectmyLockHolder=newobject();if(Cache[key]==null){lock(myLockHolder){if(Cache[key]==null){Cache[key]=LengthyDatabaseCall();我将发出多少数据库请求?10?100?或者我有线程吗?您有一个对象层次结构:您的代码只是不允许在同一服务器访问的同一进程内的线程同时修改Cache对象。您可以跨进程甚至跨服务器创建锁,但是随着您在层次结构中向上移动,成本会增加很多。使用lock语句实际上不会锁定任何线程。但是,如果一个线程在锁内执行代码(即在lock语句之后的代码块中),任何其他想要获取锁并执行相同代码的线程必须等到持有锁的第一个线程离开代码块并且释放锁。C#lock语句使用Windows临界区,这是一种轻量级锁定机制。如果要锁定进程,可以使用互斥锁。要锁定服务器,您可以使用数据库或共享文件。正如dkackman指出的那样,.NET具有AppDomain的概念,这是一个轻量级进程。每个进程可以有多个AppDomain。C#lock语句仅锁定单个AppDomain内的资源,对层次结构的正确描述将包括进程下方和线程上方的AppDomain。但是,一个进程中通常只有一个AppDomain,这种区分有些无关紧要。C#lock语句锁定对象的特定实例(使用newobject()创建)。对象(在大多数情况下)不在AppDomain之间共享,因此如果您有10个服务器,则10个线程可以使用该段代码同时访问您的数据库。锁不会阻塞线程。它锁定对象的实例。每个试图访问它的线程都被阻塞。因此,在您的情况下,每个尝试访问myLockHolder的线程都将被锁定,而不是所有线程。换句话说,我们可以说Lock语句是使用临界区的语法糖。正如您在MSDN中看到的:lock(expression)语句块其中:expression指定要锁定的对象。表达式必须是引用类型。一般来说,如果要保护一个实例变量,那么表达式就是this;如果要保护静态变量(或者如果临界区出现在给定类的静态方法中),则表达式将为typeof(class)。语句块关键部分的语句。lock将阻止应用程序中的所有线程访问myLockHolder对象。因此,如果您有10个应用程序实例在运行,则当对象被锁定时,将向服务器发出10个请求。退出lock语句的那一刻,下一个请求将在应用程序中处理,但只要Cache[key]不为空,它就不会命中数据库。您收到的实际请求数取决于此处发生的情况:if(Cache[key]==null){Cache[key]=LengthyDatabaseCall();如果LengthyDatabaseCall();失败,下一个请求将尝试访问数据库服务器并检索信息,所以最好的情况下,只有10个请求到服务器。只有在另一个线程正在使用共享变量时需要访问共享变量的线程才会进入等待状态。在任何给定时间有多少人很难确定。您的数据库将收到10个请求,请求2-10运行速度比请求1快得多的可能性很高。以上是C#学习教程:lock()语句会阻塞进程/应用程序域中的所有线程吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: