java.util.ConcurrentLinkedQueue

标签 java tomcat servlets concurrency queue

我想使用 java.util.ConcurrentLinkedQueue 作为 Servlet 的非持久队列。 这是该类(class)的 javadoc 中的简介。

An unbounded thread-safe queue based on linked nodes. A ConcurrentLinkedQueue is an appropriate choice when many threads will share access to a common collection. This queue does not permit null elements.

现在假设我在 servlet 上有 1000 个并发请求,每个线程都需要将一个对象放入 ConcurrentLinkedQueue。从描述中,我是否应该得出结论,处理负载没有问题?我需要的保证是:

  1. 我自动获得线程安全保证,无需自己进行同步。
  2. 如果流量负载超过 1000 个并发请求,我不会丢失任何请求。

谢谢

最佳答案

您实际上是在问三个不同的问题(其中两个是明确的,一个是隐含的。)这是它们以及我的答案:

<强>1。如果我使用 java.util.ConcurrentLinkedQueue,是否需要自己进行同步?

并发集合上的原子操作为您同步。换句话说,对队列的每个单独调用都保证线程安全,而无需您采取任何操作。 保证线程安全的是您对非原子集合执行的任何操作。

例如,这是线程安全的,您无需执行任何操作:

queue.add(obj);

queue.poll(obj);

但是;对队列的非原子调用不是自动线程安全的。例如,以下操作不会自动是线程安全的:

if(!queue.isEmpty()) {
   queue.poll(obj);
}

最后一个不是线程安全的,因为很可能在调用 isEmpty 和调用 poll 之间,其他线程会在队列中添加或删除项目。执行此操作的线程安全方式如下:

synchronized(queue) {
    if(!queue.isEmpty()) {
       queue.poll(obj);
    }
}

再次...对队列的原子调用是自动线程安全的。非原子调用不是。

<强>2。如果有 1000 个并发请求,我是否保证不会丢失对 java.util.ConcurrentLinkedQueue 的调用?

因为这是一个无限制的实现,你可以保证无论同时发出多少请求,队列都不会丢失这些请求(因为队列的并发性......你可能会耗尽内存或类似的......但队列实现本身不会成为您的限制因素。)在 Web 应用程序中,还有其他机会“丢失”请求,但队列的同步(或缺乏同步)不会成为您的原因。

<强>3。 java.util.ConcurrentLinkedQueue 的性能是否足够好?

通常,当我们谈论并发时,我们会谈论“正确性”。我的意思是,并发类保证它们是线程安全的(或对死锁、饥饿等具有鲁棒性)。当我们谈论这个时,我们并没有对性能做出任何保证(调用集合的速度有多快are) - 我们只保证它们是“正确的”。

但是; ConcurrentLinkedQueue 是一个“无等待”实现,因此这可能是您可以获得的最佳性能。保证 servlet 负载性能(包括并发类的使用)的唯一方法是在负载下对其进行测试。

关于java.util.ConcurrentLinkedQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435069/

相关文章:

java - 在 Java 中创建一个悬挂指针

java - Tic Tac Toe 游戏循环错误

java - 使用ajax和servlet上传文件

java - 如何在 java 中读取文本文件并访问这些值

java - 如何捕获从 Java (tomcat) 发送到 Oracle DB 的查询?

java - 将 Web 应用程序升级到 Spring Boot 2.4 后的 IllegalStateException

java - 如何更改tomcat或jetty下的Java webapp 'WEB-INF path'约定

java - 将 TCP 套接字数据馈送到 Tomcat Servlet/HTTP 应用程序

java - res.flushBuffer() 与 res.getOutputStream().flush();

java - 在 IntelliJ 中浏览 "outside"代码