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

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

徐皓君
2023-03-14

我正在浏览ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue分别有一个putLock和一个takeLock,用于插入和删除,但是ArrayBlockingQueue只使用一个锁。我相信LinkedBlockingQueue是基于简单、快速和实用的非阻塞和阻塞并发队列算法中描述的设计实现的。在本文中,它们提到了保留一个虚拟节点,这样入队者就不必访问head,出队者不必访问tail,从而避免了死锁情况。我想知道为什么ArrayBlockingQueue不借用同样的思想,而是使用2个锁。

共有1个答案

刘意
2023-03-14

ArrayBlockingQueue必须避免重写条目,以便它需要知道开始和结束的位置。LinkedBlockQueue不需要知道这一点,因为它让GC担心清理队列中的节点。

 类似资料:
  • 问题内容: 我正在查看ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue分别具有用于插入和移除的putLock和takeLock,但是ArrayBlockingQueue仅使用1个锁。我相信LinkedBlockingQueue是根据简单,快速和实用的非阻塞和阻塞并发队列算法中描述的设计实现的。在本文中,他们提到他们保留了一

  • 问题内容: 下午好, 我有两个单独的但相关的应用程序。它们都应具有自己的后台队列 (请参阅:独立的Sidekiq和Redis进程) 。但是,我偶尔希望能够将作业从推送到的队列中。 从简单的队列/推送角度来看,如果没有现有的Sidekiq / Redis堆栈,则很容易做到这一点: 但是,考虑到我本来会调用a 和from ,那么在这之间可能需要一步。 显然,我可以直接从Sidekiq内部获取序列化和规

  • 问题内容: 我有以下两个软件包: com.mycorp.project.first com.mycorp.project.second 我想配置Log4J(SLF4J),以将日志从一个包写入一个文件,而从另一个包写入第二个文件。我不希望它们混在一起。 需要明确的是,这是一个正在运行的项目/一个进程。 我已经尝试使用过滤器和记录器,但是log4j似乎忽略了它们。这两个文件始终相同。 编辑:到目前为止

  • 我试图使用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