Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我真的应该关心servlet操作类中的线程安全问题吗_Java_Multithreading_Servlets_Thread Safety - Fatal编程技术网

Java 我真的应该关心servlet操作类中的线程安全问题吗

Java 我真的应该关心servlet操作类中的线程安全问题吗,java,multithreading,servlets,thread-safety,Java,Multithreading,Servlets,Thread Safety,servlet类处理传入的请求对象,获取数据并存储到StringBuilder/StringBuffer中,并将数据传递给另一个类以写入文件 ActionClass public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String fileName = request.getparameter

servlet类处理传入的请求对象,获取数据并存储到StringBuilder/StringBuffer中,并将数据传递给另一个类以写入文件

ActionClass
    public void doPost(HttpServletRequest request,HttpServletResponse response)
   throws ServletException,IOException {
        String fileName = request.getparameter("fileName");
        String body = request.getParameter("innerHTML");
        String head = request.getParameter("headContents");

        StringBuilder sbr = new StringBuilder();
        sbr.append(body);  sbr.append(head);
                        OR
        StringBuffer sbf = new StringBuffer();
         sbf.append(body);  sbf.append(head);

   FileWrite fw = new FileWrite(fileName, sbf/sbr); /* write the data into file*/
          }
文件写入

正如您在上面的示例中所看到的,action类将数据传递给
FileWrite类
,后者将数据写入一个新文件。有数百个客户端可能同时发送请求以将数据存储在新文件中。

所以我的问题是,在servlet类中,我应该使用什么来存储数据。
String还是stringBuffer或StringBuilder
??这是线程安全的问题吗?

只要它发生在servlet的doGet或doPost中,那么您只处理一个线程。因此,不需要线程安全性,这意味着您应该使用比StringBuffer更快的StringBuilder。

只要它发生在servlet的doGet或doPost中,那么您只处理一个线程。因此,不需要线程安全性,这意味着您应该使用比StringBuffer更快的StringBuilder。

是的,您应该关心线程安全性问题,但线程安全性的问题不在于您选择的字符串、StringBuffer或StringBuilder

如果FileWriter类收到两个对同一文件名的请求,则可能需要注意线程安全


另外,我要指出,从安全角度来看,直接从get参数获取原始文件位置是非常危险的,因为用户可以覆盖其他用户文件,或者(可能,取决于权限)甚至OS文件。

是的,您应该关心线程安全问题,但是线程安全性的问题不在于您选择字符串、stringBuffer或StringBuilder

如果FileWriter类收到两个对同一文件名的请求,则可能需要注意线程安全

另外,我要指出的是,从安全角度来看,直接从get参数获取原始文件位置是非常危险的,因为用户可以覆盖其他用户文件,甚至(可能,取决于权限)OS文件。

来自Java文档

多线程使用StringBuilder实例不安全。如果需要这种同步,建议使用StringBuffer

首先,字符串被内部化

()

这意味着如果你有相同的字符串,这不是一个问题

如果页眉和页脚是静态的,那么它可能位于静态变量中。

来自Java文档

多线程使用StringBuilder实例不安全。如果需要这种同步,建议使用StringBuffer

首先,字符串被内部化

()

这意味着如果你有相同的字符串,这不是一个问题


如果您的页眉和页脚是静态的,那么它可能位于静态变量中。

对于每个新请求,都会生成一个新的servlet线程,该线程具有自己正确包装的唯一上下文。因此doPost doGet中的数据保存在该上下文中,因此不受其他请求的影响

就String vs StringBuffer vs StringBuilder而言,由于上下文本身是线程安全的,因此不存在同步问题,因此您可以选择springbuilder

另一方面:如果没有变化发生,为什么不使用简单字符串


顺便说一下。。注意同一文件有两个请求

对于每个新请求,都会生成一个新的servlet线程,该线程具有自己正确包装的唯一上下文。因此doPost doGet中的数据保存在该上下文中,因此不受其他请求的影响

就String vs StringBuffer vs StringBuilder而言,由于上下文本身是线程安全的,因此不存在同步问题,因此您可以选择springbuilder

另一方面:如果没有变化发生,为什么不使用简单字符串


顺便说一下。。注意同一文件有两个请求

如果在方法中声明变量,它将被放入一个只有当前线程才能访问的位置调用线程堆栈中。因此,只要它是局部变量,就不必担心线程安全
在您的情况下,您应该使用StringBuider,因为它速度更快,在这里不需要担心线程安全性

如果您在方法中声明变量,它将被放在只有当前线程可以访问的位置调用线程堆栈中。因此,只要它是局部变量,您就不必担心线程安全性
在您的情况下,您应该使用StringBuider,因为它速度更快,不需要担心线程安全。您的编码器是线程安全的,这在多线程环境中没有问题。因为您的ServleClass没有类级或实例级变量,所以您的FileWrite是post方法中的实例。服务器请求将有一个新的文件写入。

您的编码器是线程安全的,这在多线程环境中没有问题。因为您的ServleClass没有类级或实例级变量,所以您的文件写入是post方法中的实例。服务器请求将有一个新的文件写入..

我想你的意思是“不需要线程安全”而不是“不需要类型安全”很好,这与我当时的想法相同,但我没有那么自信,也无法在谷歌上找到答案。非常感谢。我想你的意思是“不需要线程安全”而不是“不需要类型安全”太好了,和我想的一样,但我没有那么自信,也无法在谷歌上找到答案。非常感谢。我建议您展示您将代码放入的方法,这样我们就不必做出假设(根据Neil对doGet或doPost的评论)@Nathan:我也修改并编写了另一个类和方法。我不确定
FileWrite类或它的方法是否需要
    class FileWrite{
       public FileWrite(String fileName, StringBuilder sbf){
        boolean isExist = checkFileName(fileName);  /* return true or false */
         if(isExist){
           String name =  reName(fileName);  /* rename & return new name */
                 /* write the file in new file */
          }else{  /* write in same file name */  }
      }

   public String reName(String oldName){
             /* rename oldName as newName & checks via isExist(newName) */
            } 

   public boolean isExist(String filename) {
         // checks the file in directory, if found already
       return true;
           else return false;
         }
    }