当前位置: 首页 > 知识库问答 >
问题:

为什么我们需要一个可重入的锁?

李凯定
2023-03-14

我在这里(有点)了解jdk 5 Reentry antLock的功能

但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?

共有2个答案

汝志
2023-03-14

可重入锁在资源不能容忍所有形式的任意定时访问,但可以容忍嵌套执行上下文中可能出现的某些访问模式的情况下非常有用。在许多情况下,它们的使用是不美观和草率的,但是安排一些事情以保证可重入锁能够工作,可能比安排一些事情使其变得不必要更容易。

请注意,虽然许多语言默认将锁设置为可重入的,但这不一定是一件好事。如果代码获取了一个锁,然后该线程中的其他代码试图为同一锁获取一个标记,很明显,让第二个请求等到锁被释放后不会很有效。然而,这并不意味着第二个请求应该允许访问锁。在许多情况下,正确的做法是让第二个请求抛出立即异常(在释放锁之前不应授予访问权限,并且在请求被授予(这不应该发生)或代码退出之前不会发生其他方式(异常是最自然的选择)。如果修改锁保护数据结构的方法调用了一些外部代码,而这些代码在数据结构处于不一致状态时预计不会使用数据结构,则会出现这种情况。如果代码意外地尝试使用数据结构,让它立即失败并出现异常可能比让它永远等待永远不会得到的锁,或者愉快地进入锁并访问无效数据要好。

在许多情况下,当受保护的资源满足其部分但不是全部不变量时,代码会调用嵌套例程,并且外部代码可能期望嵌套例程对其进行某些更改,而不是其他更改。在这种情况下,可重入锁可能是合适的,但需要注意确保代码不会做不该做的事情。可重入锁的一个优点是,如果使用持有锁的嵌套调用的代码设置标志以指示其promise/要求,并且获取锁的代码在进入时测试这些标志,则可以保证这些标志只会以可预测的序列进行操作。如果两个不同的线程试图同时使用资源,这样的事情是不可能的。

司寇祺
2023-03-14

考虑这个理论上的例子:在更新GUI中列表框中的某些项时,使用锁来保护一些后端数据。您可以循环并修改这些项目。执行此操作时,列表框会触发一个事件(可能是选择更改的事件或其他事件),您已为其注册了处理程序。此处理程序还锁定同一个锁以处理新项。如果锁不是递归的,这个线程将在第二次尝试获取锁时死锁。

 类似资料:
  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?

  • 为什么我们需要字典? 计算机最适合使用数字,而人类最适合使用姓名。我们创建了DNS以便记住主机名而不是IP地址。字典以相同的方式使用,因此我们可以记住AVP名称而不是类型编号。当FreeRADIUS解析请求或生成响应时,会查阅字典。 但是,字典与DNS不同,因为RADIUS客户端不知道FreeRADIUS使用的这些“友好”名称。永远不会在RADIUS客户端和RADIUS服务器之间交换AVP名称。