Java 我真的应该关心servlet操作类中的线程安全问题吗
servlet类处理传入的请求对象,获取数据并存储到StringBuilder/StringBuffer中,并将数据传递给另一个类以写入文件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
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;
}
}