注意:灌水的一律删无赦。
我目前是使用spring mvc,controller继承AbstractController,synchronizeOnSession为默认的false(我还不清楚这个设置true到底有啥用?难道仅仅是为了保证controller的同步?)。我实现的功能是使用jquery上传文件,有两个button,一个上传button,一个新增button。当点上传button时候,文件的相关信息马上读取出来,并且在下方显示出来:文件名,上传者,上传时间,文件大小等信息。而这些信息我是存储在后台的session中的。用户可以点击上传button一次上传多个文件,也可以随时删除文件。当用户最终点击新增按钮时候,才将全部文件上传到服务器。在后台的新增方法中,我是通过request.getSession(true).getAttribute("fileLists");获取之前存储在session中的文件信息的,然后循环上传到服务器中。
功能我都实现ok了。现在担心会出现的问题是,session的多线程访问问题,是否会出现数据不一致?该如何处理比较好?难道非要处理行如如下这样?HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();synchronized Session getCurrentSession(){
   session = request.getSession();
   return session;
}
我考虑的多线程安全问题是否有必要? (ps:我也考虑过,同一个用户,即使开两个浏览器,不可能手动操作在非常短的时刻内同时上传,但是使用jquery异步本身已经开启了多个线程,何况,如果别人恶意采用工具来上传文件,肯定会有多线程安全方面的问题)。
期待CSDN认证专家们给与权威解答!

解决方案 »

  1.   

    看看源码吧:
    public void handleActionRequest(ActionRequest request, ActionResponse response) throws Exception {  
            // Delegate to PortletContentGenerator for checking and preparing.  
            check(request, response);  
      
            // Execute in synchronized block if required.  
            if (this.synchronizeOnSession) {  
                PortletSession session = request.getPortletSession(false);  
                if (session != null) {  
                    synchronized (session) {  
                        handleActionRequestInternal(request, response);  
                        return;  
                    }  
                }  
            }  
      
            handleActionRequestInternal(request, response);  
        }所以,这里其实主要防止的是:对同一个session操作的线程安全问题,而不是对整个线程管理容器。
    而你这个做法:
    synchronized Session getCurrentSession(){
      session = request.getSession();
      return session;
    }
    实际上对整个获取线程做了同步(没必要),但其实却反而并没保护同一个session操作的线程安全问题。
      

  2.   

    楼主js是单线程的!!jquery没有实现多线程!
      

  3.   


    多个jquery异步请求,不算多线程吗?
      

  4.   

    假设有这么一段代码,如果客户端开多个子窗口(也就是JSessionId相同),并发请求,你觉得能实现线程安全么?(这应该就是你帖子的主要论题吧?)Session session = getCurrentSession(); // 用你写的这个方法
    Integer cnt = (Integer) session.getAttribute("counter");
    cnt = cnt + 1;
    session.setAttribute("counter", cnt);
    2楼所附源码是可以实现的。
      

  5.   

    up
    http://www.iteye.com/problems/70091
      

  6.   

    半个月前老贴被翻上来了,话说楼主你理解了么?也就是你顶楼写的无法保证操作Session的线程安全,而Spring MVC所实现的方案,是可以保证的。
      

  7.   

    Java server端的多线程问题是多个用户对全局享对象访问时候的线程安全问题