Servlets F5和CTRL+;F5在并发请求处理中导致不同的行为

Servlets F5和CTRL+;F5在并发请求处理中导致不同的行为,servlets,concurrency,httprequest,refresh,Servlets,Concurrency,Httprequest,Refresh,前提1:此问题被标记为的副本,其中接受的(唯一)答案或多或少是浏览器对多个请求使用相同的HTTP连接,而servlet容器对每个连接使用一个线程。这是这里的半个答案,我试图理解为什么刷新和硬刷新有不同的行为。显然,这不是一个严格意义上的Java问题,但仍然属于编程领域:不是重复,不是OT,imho。不需要关闭它,一个有趣的讨论可以从这里开始 前提2:我理解用F5和CTRL+F5刷新浏览器页面的区别,但这对我没有任何帮助 我有这个servlet public class MyServlet ext

前提1:此问题被标记为的副本,其中接受的(唯一)答案或多或少是浏览器对多个请求使用相同的HTTP连接,而servlet容器对每个连接使用一个线程。这是这里的半个答案,我试图理解为什么刷新和硬刷新有不同的行为。显然,这不是一个严格意义上的Java问题,但仍然属于编程领域:不是重复,不是OT,imho。不需要关闭它,一个有趣的讨论可以从这里开始

前提2:我理解用F5和CTRL+F5刷新浏览器页面的区别,但这对我没有任何帮助

我有这个servlet

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    List<String> items = new ArrayList<>();

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.print(request.getSession().getId()+" accessing list");

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        items.add(""+LocalTime.now().getSecond());

        System.out.println(items);

    }

    //irrelevant code
}
现在,我在同一个浏览器中打开三个选项卡,在每个选项卡中粘贴servlet url,然后在两秒钟内依次按enter键。这是我得到的输出

18:41:33,534 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:37,534 INFO  [...] [3, 37]
18:41:37,542 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:41,543 INFO  [...] [3, 37, 41]
18:41:41,549 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:45,549 INFO  [...] [3, 37, 41, 45]
看起来每个请求都是按顺序处理的:对于要处理的每个请求,您必须等待前一个请求被终止

但如果我返回到三个选项卡并快速按住CTRL+F5键,我会得到我所期望的行为:

18:46:37,812 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:38,838 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:39,571 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:41,815 [...] [3, 37, 41, 45, 41]
18:46:42,838 [...] [3, 37, 41, 45, 41, 42]
18:46:43,571 [...] [3, 37, 41, 45, 41, 42, 43]
每个请求都并行运行。 最后一个测试,如果我只是F5它们,我会返回到意外的顺序行为

18:50:10,581 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:14,582 [...] [3, 37, 41, 45, 41, 42, 43, 14]
18:50:14,590 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:18,591 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18]
18:50:18,597 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:22,597 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18, 22]
有人能帮我了解一下幕后发生了什么吗?为什么我的请求有时是按顺序处理的

我使用的是Windows、WildFly 8.x AS、Chrome或Firefox(行为相同)

注:
我使用
[…]
来缩短输出,但它显示每个请求都由不同的线程处理(确切地说是不同的
线程.currentThread().getName()
值)。这意味着“每个连接一个线程”不是真的,我更困惑了…

F5?这在你的浏览器中有什么作用?@Raedwald它可能会返回一个缓存页面,而ctrl+f5不能记录分和秒?分和秒已经存在there@BalusC,我很感激你试图将我引向相关资源,但我还是很难抓住重点。我仍然不理解结束这个问题的冲动,我正在寻求帮助,而其他“类似”的问题并没有解决我的疑问
18:50:10,581 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:14,582 [...] [3, 37, 41, 45, 41, 42, 43, 14]
18:50:14,590 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:18,591 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18]
18:50:18,597 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:22,597 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18, 22]