在我的应用程序中,数据生成速度(存储在concurrentLinkedQueue中)大于单线程可以使用的数据。
我决定从创建4个线程开始使用数据,以防止我的应用程序出现内存异常"。
问题:
内存一致性效果:与其他并发集合一样, 在将对象放入a之前的线程中的动作 ConcurrentLinkedQueue发生在访问之后的操作之前 或从另一个中的ConcurrentLinkedQueue中删除该元素 线程。
答案 0 :(得分:1)
您应该在offer
上使用poll
和ConcurrentLinkedQueue
方法,而不是直接使用迭代器。迭代器是weakly consistent。
while(true) {
final Item item = queue.poll();
if (item == null) {
break;
}
// do something with item
}
许多线程可以安全地同时调用offer
和/或poll
。
答案 1 :(得分:1)
我认为你不应该迭代,而是从队列中创建每个轮询数据的4个线程,以便轮询数据将被删除或换句话说消耗
// your queue
ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue();
// create 4 Threads
for (int i = 0; i < 4; i++) {
new Thread(() -> {
while (true) {
// consume element
concurrentLinkedQueue.poll();
// do something with element
// here
}
}).start();
}