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

ArrayBlockingQueue使用单个锁进行插入和删除,但LinkedBlockingQueue使用2个单独的锁

戴原
2023-03-14
问题内容

我正在查看ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue分别具有用于插入和移除的putLock和takeLock,但是ArrayBlockingQueue仅使用1个锁。我相信LinkedBlockingQueue是根据简单,快速和实用的非阻塞和阻塞并发队列算法中描述的设计实现的。在本文中,他们提到他们保留了一个虚拟节点,以使排队器不必访问头,而出队器也不必访问尾部,从而避免了死锁情况。我想知道为什么ArrayBlockingQueue不借鉴相同的想法,而是使用2个锁。


问题答案:

ArrayBlockingQueue必须避免覆盖条目,以便需要知道起点和终点在哪里。LinkedBlockQueue不需要知道这一点,因为它使GC担心清理队列中的节点。



 类似资料:
  • 我正在浏览ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue分别有一个putLock和一个takeLock,用于插入和删除,但是ArrayBlockingQueue只使用一个锁。我相信LinkedBlockingQueue是基于简单、快速和实用的非阻塞和阻塞并发队列算法中描述的设计实现的。在本文中,它们提到了保留一个虚拟节点

  • 我试图使用updateExpression更新一个项,我想编辑一个属性并删除同一对象上的另一个属性,但我得到以下错误: UpdateExpression无效:语法错误;令牌:EOF near:“attributeToDelete” 我必须承认,我编写更新表达式时猜测了正确的使用方法(失败)。下面是代码片段: 当我想包含多个操作时,我应该如何编写UpdateExpress?(其中操作是-

  • 问题内容: 这应该是一个相当简单的问题,但我无法在线找到可靠的答案。我试图将多个行插入到同一表中,但只有一条语句。我在网上看到的最受欢迎的是以下内容,但我读到它仅适用于SQL Server 2008: 如果此方法可与SQL Server 2005一起使用,我会更喜欢此方法,但我认为不会。根据我的阅读,另一个选项与INSERT之后的UNION ALL以下SELECT语句有关,这似乎很笨拙。有谁知道在

  • 问题内容: 我想轻松删除多个表,而无需在删除查询中实际列出表名,并且要删除的表的前缀为“ wp_” 问题答案: 只需分享其中一种解决方案: mysql> SELECT CONCAT(“ DROP TABLE”, GROUP_CONCAT(TABLE_NAME))as stmt 从information_schema.TABLES WHERE TABLE_SCHEMA =“ your_db_name

  • 我想在Cassandra 1.2.8中插入一个有50,000列的单行。在插入之前,我已经准备好了整行的所有数据(在内存中): 列名是整数,允许对分页进行切片。列值是该特定索引处的值。 这要花很多时间。即使当我们把上面的插入物放入一批中时,也需要大量的时间。 我们已经有了所需的全部数据(完整的行),我假设只说“这里,Cassandra,在一个请求中将此数据存储为单行”是非常容易的,例如: 通过当前的

  • 我有以下疑问: 正如预期的那样,我得到了以下结果: 有没有办法将上述结果复制到另一个表中,使我的表看起来像这样? 我的问题是,可以预期任何数量的行,因此我不确定如何迭代未知数量的行。