如果使用Atomic,是否存在锁争用

问题描述

这并不特定于任何语言。只是想更好地了解“锁争用”术语。

让我们说:我们要使用ARM指令执行两种命令

我们有 10 家商店,每家商店都销售产品,有一个中央老板拿着账本记录销售的总产品。

如果我们使用独占,我的形象是: 10 家商店说我要更新总和,BOSS 将分类帐交给其中一家商店,他将销售的产品添加到总和。 然后老板将分类帐交给下一家商店。他们都轮流进行,所以总和不会搞砸。

如果我们使用原子,我的形象是: 10家店只写信给BOSS他们卖了多少产品,BOSS会自己一一算。没有授予任何商店等的许可。 总和只是为 10 个商店做 AtomicAdd。 那么在这种情况下,要争用的锁是什么?

解决方法

atomic 没有处理您正在查看的概念。假设其中一家商店的产品数量非常多,数量也很多。这家商店位于Gotham City,有很多顾客和员工。区域老板大喊“停止”以添加分类帐。不幸的是,更新 Gotham City 壁架的员工将 999,999 更改为 1,000,000,而数字显示为 1,999。

如果区域老板不能大喊“停止”,那么其他商店的员工可以在计算库存时更改计数。如果商店交换库存,这可能会导致不准确。此外,您永远不会知道在第一个商店和最后一个要访问的商店计数之间的某个时间的实际销售额,您在所有商店都有销售额,这将改变总和的准确性。

现在,假设有区域老板和国家老板。全国老板尝试了两种方法来计算所有的销售额。她汇总了所有区域老板的计数,并对所有商店进行了完整计数。这些数字不会相等,除非她大喊“停止”以确保没有销售并且每个区域经理都可以进行区域计数。她可以在基本过程停止的同时进行全国总计数。不幸的是,由于这需要时间和造成的销售损失,该企业破产了。


业务改革,他们决定一次只计算一个地区。地区老板或国家老板可能会为该地区大喊“停止”。当两个老板同时大喊“停止”时,就会发生锁争用。另外,销售如何重新开始?老板必须大喊“GO”。如果两个老板同时进行销售统计,只要第一个完成的老板大喊“开始”,商店就会开始转售。这会导致库存盘点不准确(以及一次只盘点一个本地区域),并且企业破产,因为他们没有产品可以销售,客户感到沮丧并转而去其他地方。


公司进行了改革,他们决定销售人员每次进行销售时都会更新地区数量和全国数量。由于全国经理之前看到了一些问题,她考虑了很长时间销售人员将如何更新这些计数。他们购买了一台机器,每次按下按钮时,计数都会增加一个。正如她所知,如果员工必须查看计数,则在计算新数字时,地区和国家数字可能会发生变化。


第二种情况存在锁争用问题。锁大喊“停止”和“继续”,当多个参与者/进程想要同时使用该锁时,您就会发生争用。所有情况都是 atomic 的问题。这是更新信息的能力,以便在其他读取(或读取更新)值时保持一致。在最后一种情况下,机器为业务提供了一个“无锁”原语,这样他们就可以在不需要锁的情况下自动更新计数。

当您的计算涉及多个原子值或读写混合时,就需要锁。如果该值一开始就不是原子的,那么即使锁也不起作用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...