我知道在servlet过滤器中我们应该注意我们的instace varibles的线程安全性,但是在下面的代码中,我使用了stringBuilder和stringBuffer(一个线程安全,一个没有)。
public class ValidationFilter implements Filter {
//thread safe
// StringBuffer request=new StringBuffer();
//not thread safe--lets check if it works fine
StringBuilder request=new StringBuilder();
////NOTE!!!:even with large request lenght no interference was seen so what is the problem with NOT being thread safe??
@Override
public void init(FilterConfig config) throws ServletException {
//
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
//HERE WE PUT SOME CODE REGARDING TO FILTERING REQUESTS
//HERE WE SHOULD DEFINE A REGEX TO VALIDATE THE STRING IF IT IS NOT THE RIGHT STRING REDIRECT THE REQUEST TO A NEW ADDRESS!!
//String is immutable so we need to use string buffer or string builder
//StringBuffer is synchronized, StringBuilder is not. BUT as far as we know Servlet creates new thread for each request fo we
//need to be synchronised!!
request.append(req.getParameter("line"));
System.out.print(request);
if (request!=null){
Token.trim(request.toString());
res.getWriter().print(request);
}else {
res.getWriter().print("Error got Null from the client!");
}
}
@Override
public void destroy() {
//
}
}
在这两种情况下我发送一个非常长的请求使用一个表格如下(实际上通过使用这种形式我发送两个非常长的请求输入)但我们得到上述过滤器的输出,我没有看到任何干扰之间输出结果,这意味着这两个运行线程安全并没有破坏StringBuffer或StringBulder,所以剂量意味着线程安全剂量在这种情况下?
<!DOCTYPE html>
<html>
<head>
<title>a request page</title>
</head>
<body>
<form action="http://localhost:8080/Compute" method="POST">
Compute it: <input type="text" name="line"><p>
<input type="submit" value="Compute">
</form>
</body>
</html>
答案 0 :(得分:0)
由于StringBuffer已同步,因此您未看到输出结果之间存在任何干扰的唯一原因,StringBuilder未同步。请注意,StringBuffer和StringBuilder对象是可变的,这意味着可以更改存储在String对象中的值。
由于StringBuffer
已同步,因此使用起来更安全。
答案 1 :(得分:0)
它们都在错误的环境中使用。过滤器不应该保持请求的状态。其他人已经提到的StringBuilder
上的操作不是线程安全的。同样,Jon提到StringBuffer
上的操作仅对单个操作是安全的,而不是对聚合操作例如安全。您最终可能会在同一append(...)
个对象的多个主题中拥有StringBuffer
。