那和普通意义上的vector或者hashtable的同步是不一样的
它相当于一个连接池,不同的是连接池是从数组里面取连接,而他是从一个hashmap里面取action。
struts为了防止初次初始化action时的并发请求产生的不一致使用了同步
用户的每一次请求都要检测请求的action是否创建,而这个检测是一段synchronized代码段
java不支持双重检查,就只能为了避免小概率事件发生而损失性能。
这里是所有请求必经之路,你所说的没有真正意义上的并发却时时在发生,不信我给你一个例子,
用线程模拟的,只是10个线程同时进行(实际中对应10个用户),请求同时到达几率很大的

解决方案 »

  1.   

    补充一句:vector或者hashtable的同步基本上是没啥大用的,我很少看到有人
    在代码中构造一个容器级别的vector,即使这样做了,业务逻辑也很少由此经过的。
      

  2.   

    这个同步应该是系统级的,所以编码人员和设计人员可以不考虑
    此设计方法是便于集中控制,优点也在于此,因为是系统级的性能上应该不是很差,只要web容器能支持,我想struts就应该能支持,因为到现在还很少听说有这方面的bug
      

  3.   

    工业支持标准?
    不知道你说的是重工业还是轻工业
    struts作为轻量级的框架不错阿
      

  4.   

    一个东西用的人多了,自然有争议,就象微软的windows,struts只是web层的一个框架,项目的成败或性能不能取决于它,只要你用得得当,它还是很能提高工作效率的.
      

  5.   

    我人为struts一个不好的地方就是与servlet的联系太过紧密了.可移植性太差了!!
      

  6.   

    java不支持双重检查,就只能为了避免小概率事件发生而损失性能。>>java不是保证在32位机器上给int赋值为原子操作吗?
      

  7.   

    同意楼主的看法,说说我的愚见:并发的可能性还是比较大 一旦并发hashmap中一个action就可能对应多个实例(并发的请求分别创建相同的action实例),检验时同步感觉确实影响性能,不过同步是web请求走单一入口所付出的代价。希望大家能继续深入探讨一下。我把那个方法的代码贴出来供大家参考:
     protected Action processActionCreate(HttpServletRequest request,
                                             HttpServletResponse response,
                                             ActionMapping mapping)
            throws IOException {        // Acquire the Action instance we will be using (if there is one)
            String className = mapping.getType();
            if (log.isDebugEnabled()) {
                log.debug(" Looking for Action instance for class " + className);
            }
            
            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);
            }        return (instance);    }
      

  8.   

    更正一下上面的内容:
    并发的可能性还是比较大 如果没有同步,一旦并发hashmap中一个action就可能对应多个实例(并发的请求分别创建相同的action实例),检验时同步感觉确实影响性能,不过同步是web请求走单一入口所付出的代价
      

  9.   

    java有读写锁吗?这个应该简单的通过一个读写锁就可以提高并发性。