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

标签 java string multithreading tomcat hashset

我正在尝试编写一个多线程的 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/

相关文章:

java - Thread.stop 和 friend 在 Java 中安全吗?

string - 在 Go 中解析格式化字符串

java - 将一个字符串转换为多个字符串

java - 如何理解嵌套监视器导致死锁?

java - com.intellij.ide.ClassUtilCore 对 sun.net.www.protocol.jar.JarFileFactory.fileCache 字段进行非法反射访问

java - 结束夏令时的问题

java - Gradle bootrun 错误,进程命令以非零退出值 1 完成

string - 无法在类型 'System.String' 上具有相同长度 1 的多个构造函数之间进行选择

ios - DispatchQueue.main.async 不会崩溃但 DispatchQueue.main.sync 会崩溃?

multithreading - 每个连接的 Netty 多线程