我有一个静态类package woniu.web;import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
 * 该类用于辅助Servlet处理信息
 * @author kok
 *
 */
public class AidServlet{

public static ServletContext sct = null;

/**
 * 转发到指定的URL
 * @param req HttpServletRequest
 * @param resp HttpServletResponse
 * @param url 目标
 * @throws ServletException
 * @throws IOException
 */
public synchronized static void dispatcherToUrl(HttpServletRequest req,
HttpServletResponse resp,String url) throws ServletException, IOException{
synchronized (sct) {
sct.getRequestDispatcher(url).forward((ServletRequest) req, resp);
}
}
}
这个类的dispatcherToUrl方法可能会被多个servlet使用,
我让dispatcherToUrl同步正确吗?
同步了dispatcherToUrl,有必要同步ServletContext吗?如果直接让类synchronized ,这样合理吗?我没有看多线程方面的知识,所以目前还不知道并发细节上得问题,所以请教大家看看我这里的代码哪些有问题

解决方案 »

  1.   

    直接将public static ServletContext sct = null;
    改为非静态的不就好了吗public ServletContext sct = null;
      

  2.   


    有意义吗?
    ServletContext在整个WEB项目中应该只有一个吧。
      

  3.   

    楼主这个地方根本就不需要做同步。楼主仔细想想,WEB吧。
    sct.getRequestDispatcher(url):这里是通过RequestDispatcher去实现跳转的。每个请求都会有独立的HttpServletRequest,你这里做同步有什么意义呢???
      

  4.   

    我知道,没必要声明public static ServletContext sct = null;这样做多此一举,
    我知道HttpServletRequest用它直接转发就可以了,并且HttpServletRequest的线程是安全的,我这么做的目的是了解一下关于并发时的疑问,(我没有学过多线程),比如说,我在servlet中调用了一个静态方法,如果这个静态方法只涉及到‘读’,我有必要对这个静态方法同步吗?假设我同步静态方法内中有类似于ServletContext这种线程不安全的对象,那么我有必要在静态方法中对ServletContext同步吗?
      

  5.   


    这在不同的场景中就有不同的解决方案,就像你刚才提供的这个例子一样。
    在WEB中完全不需要同步,但是假设做一个其它的类型Servlet容器的东西,可能就需求。
    没有固定不变的代码,任何代码移植到任何平台都要根据自身的环境所改变。
      

  6.   

    HttpServletRequest不是有getRequestDispatcher么 搞这么复杂作甚