gpt4 book ai didi

java - apache tomcat servlet 中 java HashSet 的线程安全

转载 作者:行者123 更新时间:2023-11-28 23:26:05 24 4
gpt4 key购买 nike

我正在尝试编写一个多线程的 apache tomcat servlet,它将在它处理的每个 POST 正文中接收大量文本,并且在 GET 请求时,它将返回接收到的唯一单词的数量。我已经设法使用 Qt 和 QtWebApp 库完成了这项工作,但是我似乎无法在 Java 中完成这项工作。我不确定问题出在哪里,但可能与应用程序的整体线程安全有关(或者与单词的拆分和保存方式有关)。返回的字数总是太高(比实际数量高大约 2000-4000,即 70000 到 140000 - 我确实有这些测试用例的结果)。我的代码如下:

@WebServlet(name = "data", urlPatterns =     {"/myserver/","/myserver/data","/myserver/count"})
public class data extends HttpServlet {

HashSet<String> slova = new HashSet<>();
public final Lock lock = new ReentrantLock();

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");


try (PrintWriter out = response.getWriter()) {


if("POST".equals(request.getMethod()) && "/osp/myserver/data".equals(request.getRequestURI())){

InputStream body = request.getInputStream();
GZIPInputStream gstream = new GZIPInputStream(body);
BufferedReader buffreader = new BufferedReader(new InputStreamReader(gstream, "UTF8"));


String vse ="";
StringBuffer sbuffer = new StringBuffer();

while ((vse = buffreader.readLine()) != null)
{
sbuffer.append(vse);
}

String text = sbuffer.toString();
System.out.println(text);


String[] words = text.split("\\s+");

lock.lock();
for(int i = 0; i < words.length; i++){

slova.add(words[i]);

}
lock.unlock();

}
if("GET".equals(request.getMethod()) && "/osp/myserver/count".equals(request.getRequestURI())){

out.println(slova.size());
slova.clear();
}

}
}

知道是什么原因造成的吗?任何反馈将不胜感激。我可以根据要求发布可用的 Qt 源代码。

最佳答案

JB Nizet 提到的字符串拆分是问题的根源。

关于java - apache tomcat servlet 中 java HashSet 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921791/

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