gpt4 book ai didi

java - Java 中阻塞线程的监控和终止

转载 作者:行者123 更新时间:2023-12-02 00:38:25 29 4
gpt4 key购买 nike

在我当前正在编写的基于 servlet 的应用程序中,我们为读者和作者提供了单独的线程类。使用 LinkedBlockingQueue<byte[]> 将数据从写入器传输到多个读取器,因此如果没有可以从写入器获取新数据,则读取器会安全地阻塞。问题是,如果由这些读取器线程提供服务的远程客户端终止连接,Tomcat 不会抛出损坏的管道,除非写入器发送新数据并尝试将此新 block 传输到远程客户端。换句话说,可以针对我们的服务执行以下攻击:

  1. 启动流式写入请求,并且根本不向其中写入任何数据。
  2. 继续创建和删除读取连接。由于写入器不生成任何数据,因此附加到它的读取线程保持阻塞状态并消耗内存和其他资源。
  3. 观察服务器的 RAM 是否很快耗尽。

我是否应该创建一个维护线程来监视属于阻塞读取器线程的套接字并发送 interrupt()对于那些似乎与各自客户失去联系的人?上述架构是否存在重大缺陷?谢谢。

最佳答案

在我看来,该漏洞在于您的读者永远等待,无论传入连接的状态如何(当然,您无法知道)。

因此,如果合适的话,解决此问题的一种直接方法是使用 poll BlockingQueue 上的方法,而不是 take .调用poll允许您指定一个超时,之后如果没有数据添加到队列中,读取器将返回null

这样,读者就不会永远被阻塞,并且应该相对较快地回到正常的处理循环,从而允许他们的资源在适当的时候被释放。

(当然,这不是万能药;当超时仍在运行时,读者会消耗资源。但最终,资源有限的服务器将容易受到 DDOS 攻击 - 这会将其影响降低到可定制的程度。小窗口,至少不会让您的服务器永久瘫痪。)

关于java - Java 中阻塞线程的监控和终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7076272/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com