c# - 锁定线程与进程
问题描述
这是一段使用锁的示例代码:
public static class Account
{
decimal balance;
private static Object thisLock = new Object();
public static void Withdraw(decimal amount)
{
lock (thisLock)
{
if (amount > balance)
{
throw new Exception("Insufficient funds");
}
balance -= amount;
}
}
}
假设此方法由 Web api 调用。API 托管在 IIS 上。我的理解是,当 IIS 收到请求时,可以创建一个新的工作进程。因此,如果收到两个并发请求,并且它们正在两个单独的进程上执行,那么上面的锁就没有什么用了,我需要使用某种进程间阻塞。我的理解正确吗?
解决方案
不同的请求将由不同的线程提供服务,所以是的,锁是有效的。但是:当使用服务器场(如多个 azure Web 应用程序实例)时,此锁仅适用于一个实例。因此,在分布式编程的世界中,您将不得不重新考虑您的设计。太多的锁会减慢系统的速度,并且请求必须等待轮到它们。
推荐阅读
- c - fpclassify(x) == FP_NAN 在功能上是否等同于 isnan(x)?
- javascript - SVG 图表使用 Canvg 转换错误
- openshift - Openshift 集群 - Github webhook 不工作
- paraview - 从 pv 服务器加载 Paraview 状态文件
- mysql - 在 mysql 上使用 current_date 检查约束
- c# - C#, ASP.NET MVC, Entity Framework : relationship multiplicity constraint violation
- java - Problem using data objects passed into JBPM 7.44/RH PAM 7.9 from
- android - Firestore 侦听器在 Android 上使 Unity 应用程序崩溃,但在 Unity 编辑器中工作正常。我该如何解决这个问题?
- c# - ASP.NET Core Razor Pages - 返回 Page() 后复杂模型属性为空
- c# - 如何了解之前打开了哪个页面