Action instance = null; synchronized (actions) { // Return any existing Action instance of this class instance = (Action) actions.get(className); if (instance != null) { if (log.isTraceEnabled()) { log.trace(" Returning existing Action instance"); } return (instance); } // Create and return a new Action instance if (log.isTraceEnabled()) { log.trace(" Creating new Action instance"); } try { instance = (Action) RequestUtils.applicationInstance(className); // :TODO: Maybe we should propagate this exception // instead of returning null. } catch (Exception e) { log.error( getInternal().getMessage("actionCreate", mapping.getPath()), e); response.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getInternal().getMessage("actionCreate", mapping.getPath())); return (null); } instance.setServlet(this.servlet); actions.put(className, instance); }
instance = (Action) actions.get(className);
此代码表情当带有同样URL的请求过来时,会拿同样的action。此时就会发生多线程资源共享的问题。所以如果action类的成员变量修改会传递到下一个使用action的线程。所以不建议在action中使用成员变量。另外只允许一个线程对action进行操作!