- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么ABQ还没有采用LinkedBlockingQueue的方式实现。我们可以使用 AtomicInteger 来保存 ABQ 中的 Track 计数,就像 LBQ 一样。我们也可以使用两把锁进行 ABQ。我偶然发现了类似的问题。 ArrayBlockingQueue uses a single lock for insertion and removal but LinkedBlockingQueue uses 2 separate locks
但我无法理解这个问题的答案。我需要帮助来理解如果我们使用两个锁实现 ABQ 会出现的问题。如果有人能给出可能失败的竞争条件的例子,那就太好了。这个问题可以标记为重复,但我确实在寻找更具描述性的答案。这将是一个很大的帮助。
我在这里粘贴了代码http://pastebin.com/ZD1uFy7S 。任何人都可以显示粘贴的代码中是否可能存在竞争条件。
最佳答案
ArrayBlockingQueue,根据定义,当 put() 发生并且其固定数组已满时,会阻塞等待空间变得可用。
可用的空间是从 take() 返回的元素。换句话说,随着时间的推移,固定数组中的元素会被重用。 put()必须将其项目写入数组中的特定位置。
另一方面,LinkedBlockingQueue 是一个链表。对于本次讨论,假设您创建了一个有界队列,只是为了使其更类似于 ArrayBlockingQueue。尝试同样的事情:
当 LinkedBlockingQueue 已满时,put() 一个元素。它将等待一个元素变得可用。
但在这种情况下,当您执行 take() 时 - 它只会返回 head 值并取消该项目。然后 put() 会发现 LinkedBlockingQueue 低于容量。它将其项目链接到列表的尾部。不会像 ArrayBlockingQueue 那样覆盖内存,它必须保持连续。
编辑:这是一种假设练习,因为代码不是这样编写的。但无论如何,这里有更多细节,特别是插入和提取方法: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/ArrayBlockingQueue.java
潜在问题如果使用了 2 个锁,并且现有代码或多或少保持不变:
ArrayBlockingQueue已满
线程 1:调用 take(),获取锁 A,执行其操作,将计数递减至 [capacity-1] ——但尚未完成
线程 2:调用 put(),在 T1 仍在运行时获取锁 B,将计数增加到 [capacity],释放锁 B
线程 1:发出 notFull() 信号
线程 3:put() 开始执行,即使数组确实已满,也会覆盖一个元素,因为 ArrayBlockingQueue 使用循环增量。
这种情况不会发生在 LinkedBlockingQueue 中。
关于java - ArrayBlockingQueue : concurrent put and take,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541672/
当我阅读ArrayBlockingQueue.take方法的源代码时,我遇到了一个问题。 我认为两个线程同时调用 take 方法,只有一个线程可以成功获取锁,而另一个线程将在以下行等待锁:lock.l
我正在寻找与 ArrayBlockingQueue 类似的库。就是这样,我不需要它提供的线程安全功能(为了更好的性能目的),因为它在 offer(E e) 方法中使用了 ReentrantLock 。
我编写了解决有界生产者和消费者问题的程序。在构造 ArrayBlockingQueue 时,我定义了容量 100。我正在使用方法 take 和 put inside threads。而且我注意到有时我
我刚刚在研究 JDK 1.6 时发现ArrayBlockingQueue - 构造函数调用了公共(public)可重写方法之一!我认为这对于 API 来说是一种不好的做法。 public Array
ArrayBlockingQueue 中没有一个操作与它的任何其他操作并发;他们总是拿同一把锁。即使对于 size() 方法,它也需要一个锁。 public int size() {
我正在研究 BlockingQueue 接口(interface),其中 ArrayBlockingQueue 是一个实现。出于演示目的,我开发了以下代码: import java.util.conc
只是为了学习,我编写了以下用于自定义线程池的代码,引用并编辑显示的代码 here. 如代码所示,我使用 ArrayBlockingQueue 作为任务队列。 代码: import java.util.
场景:在我的消费者有机会消费之前,我的生产者填满了数组,比如 capacity new int[10]。我的生产者看到数组已满并阻塞。 然后我的消费者出现并删除了 int[0],并向生产者发出信号,该
关键字synchronize 没有出现在ArrayBlockingQueue 的源代码中。这是否意味着我可以出于“我自己的目的”自由使用它的内在锁?或者这会在未来发生变化吗? 最佳答案 一般来说,我会
我有两个线程,一个分派(dispatch)消息,另一个解析消息。简单,常见。我使用 ArrayBlockingQueue 进行同步,但不希望调度程序直接访问工作消息队列 - 我使用包装器。问题是是否应
您好,我很好奇是否有办法检查 ArrayBlockingQuery 查询当前是否被锁定?原因:我有一个服务器,它监听套接字,接收参数,处理它们,然后将一些结果返回给客户端。该服务器(假设是服务器 A)
我知道下面代码中进行的递增不是原子的。我希望增量、插入阻塞队列和打印计数器的值一起成为一个原子操作。我知道原子 int 但我正在尝试使用同步来使其工作以用于学习目的。 int counter = 0;
对于 Java 中的 ArrayBlockingQueue,queue.add(element) 是否会锁定它所在的线程?我有一个运行着数十个线程的应用程序,它们会将所有信息放入一个 ArrayBlo
我有一个 ArrayBlockingQueue,它有多个与数据库的连接。许多线程尝试通过轮询来获取连接。队列中可用的最大连接数为50,超过50后,线程必须等待连接放回才能获取数据库连接。 问题是我无法
我发现自己在重复这种模式,并且常常想知道这在 Java 中是否是惯用的,或者是否有更好的方法来实现这种行为。 问题:给定生产者/消费者设置,消费者想要处理批量的项目,因此它使用 drainTo(),但
我有一个简单的 ArrayBlockingQueue 测试如下: public class TestQueue { static class Producer implements Runna
ArrayBlockingQueue 包含一个作为数组的缓冲区。它还支持公认的低效 public boolean remove(Object o) Removal of interior elemen
我正在尝试编写一个像ArrayBlockingQueue这样的简单队列,其中如果在添加元素时队列已满,则队列的头部将被删除。该类应该只具有以下公共(public)方法 获取队列的大小 从队列头部获取一
这是我第一次在 StackOverflow 上提问。我遇到的问题如下: 我有一个生产者和消费者类。在 Producer 类中,我逐行读取文件并将这些文本行放入字符串列表中。当列表有 x 行时。该列表被
我正在尝试调整执行以下操作的线程: 只有 1 个线程的线程池 [CorePoolSize =0, maxPoolSize = 1] 使用的队列是 ArrayBlockingQueue 问题 = 20
我是一名优秀的程序员,十分优秀!