当前位置: 首页 > 面试题库 >

Java锁定结构最佳模式

夏昌胤
2023-03-14
问题内容

从技术角度来看,这两个列表之间有什么区别?首先是lock的
java doc中提供的一个。其次是我的。

1。

 Lock l = ...;
         l.lock();
         try {
             // access the resource protected by this lock
         } finally {
             l.unlock();
         }

2。

Lock l = ...;

     try {
         l.lock();
         // access the resource protected by this lock
     } finally {
         l.unlock();
     }

问题答案:

原因可以在以下.unlock()文档的javadoc中Lock找到:

实施注意事项

锁实现通常会限制哪些线程可以释放锁(通常只有锁的持有者才能释放该锁), 并且如果违反该限制,则可能引发(未经检查的)异常
。任何限制和异常类型都必须由那个Lock实现记录下来。

同样,a .lock()可能会因未检查的异常而失败。

这意味着:

l.lock();
try {
    ...
} finally {
    l.unlock();
}

如果 锁定 失败,您将永远无法进入unlock()。而在:

try {
    l.lock();
    ...
} finally {
    lock.unlock();
}

如果锁定失败,则不必要地引发两个异常;而其中之一将丢失。

更不用说,取决于锁的 实现 方式,在第二个版本中,您可能最终会解锁“别人”的锁……这不是一件好事。



 类似资料:
  • 问题内容: 我必须建立一棵树,其中将包含约300个节点。该树没有深度限制。因此它可以具有3或15个级别。每个节点可以有无限数量的子代。 优先考虑的是尽可能快地获得完整的树/子树,但有时我也需要添加节点或移动节点,但并不是那么频繁。 我想知道在数据库中存储树的最佳方法以及在php中检索数据(如果可能)的最佳方法。 问题答案: 您可以使用 嵌套集模型, 因为它可以产生非常有效的查询。检出在MySQL中

  • 问题内容: 该图非常大,但无向。边缘未加权。 在我的实现中,我必须找到最大度数的顶点,并在顶点和边上都删除。 链表?数组列表?地图? 哪种对我的实施更好? 问题答案: 我的建议是将顶点存储在优先级队列中。这样,您可以非常快速地访问最高度的顶点。至于如何实现顶点,我将每个相邻的顶点存储在某种形式的数据结构中,例如HashSet或TreeSet,以便能够有效地删除内容。我不会明确地表示边缘,这不是必需

  • 我更喜欢第一种方式,因为我认为在构建器中重复它们是多余的。第一种方法是否存在一些缺点? 提前谢谢,抱歉我的英语不好。

  • 我有两个函数作为互斥锁和解锁: 我有这两个功能的原因是因为我不希望不同客户端之间的数据竞争,覆盖数据等等,这允许我锁定一段数据,修改它,然后解锁,以便其他客户端读取/更新。我没有使用postgres锁(表锁、行锁、咨询锁),因为我需要锁定多个事务的能力,而且因为我在程序中使用数据库池,所以我不能使用咨询锁,因为同时有多个会话连接到数据库,我无法控制哪一个锁/解锁 有没有更好的方法可以做到这一点(比

  • 问题内容: 我想要一个从键到对象,反之亦然的数据结构(与仅在单个方向上映射的HashMaps不同)。一个想法可能是将HashMap存储在其内部以进行反向查找,但这将是一种低效的方法。 双向映射的最佳实现是什么? 问题答案: 最简单的想法:包装器类包含2个映射,第二个包含交换的键/值。您将保持O(1)的复杂性,并且将仅使用稍微更多的内存,因为您(可能)将对象保留在那里。

  • 我这里有一个相对复杂的JavaCRUD用Swing组件编写。我正在考虑在JavaFX中重写它的GUI。现在的问题是: 我创建了一个类,用于保存下载的数据、存储SQL命令和有关任何给定表的其他信息。我在表的构造函数中定义了该表的数据结构。这样地: 这样一来,每当数据库表结构发生变化时,我就不必接触这个类的代码。我将镜像构造函数中的更改,并相应地编辑GUI。 (在类内部,数据存储为ArrayList。