在使用 EJB 的时候,我们知道对于 EJB 的无状态 SessionBean , EJB 容器是提供的池化管理,这样能够处理大并发的性能问题,
在使用 Spring 的时候,其 Bean 的默认配置是单例模式, 但 Spring 的优势似乎不在解决大并发访问上,
那么我想知道的是,对于 EJB 的池化管理与 Spring 的单例模式来比较,他的大并发处理优势体现在哪里?
我的理解:
    我理解不了他们的本质上有什么区别, 如果说是使用单例(类中没有同步问题), 那么多个用户访问的是'同一份'内存中的字节码,
对于使用池化管理,那么多个用户访问的是不同实例的'同样内容'的存在内存中的字节码,那么处理内存中的'同一份'字节码,与处理内
存中的多个不同实例的'同样的内容'字节码相比,他们的差别在哪里?
   
请各位大虾帮帮小弟, 这个问题困扰我很久了, 想破头都没想通如何解释.....

解决方案 »

  1.   

    单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。
      

  2.   


    多线程的局部变量是隔离的理解, Spring 采用的 ThreadLocal 理解   我的问题重心是在与 单例模式 与 池化技术他们在并发访问的时候, 池化技术的性能优势是如何体现的; 因为对于多人访问"同一个对象实例的方法",与多人访问"多个实例的同样方法", 我不理解他们的本质区别在哪...(不都是内存中的那块字节码吗?)
    Thanks for the above answers.
      

  3.   

    我的理解,上述两者的性能都在于减少了new的机会,单例只new一次,而池能够减少不必要的new。new是很花费时间的。
    而单例还是非单例,本身对运行效率(如果代码线程安全)没有任何影响
      

  4.   


    单例的方法调用会队列, 这个还没想过,例如 Tomcat 接受到并发请求,会触发多个线程来处理访问, 如果此时使用单例模式也是同一个对象的多线程访问,多线程他们应该是存在竞争关系吧,竞争CPU的时间,我觉得和队列没什么关系; 
      

  5.   


    单例也仅仅是 new 一次, 像 Spring 的 IOC 容器,其会在容器初始化的时候就将对象初始化,所以在访问的时候不会存在 new 的过程了;
      

  6.   


    请问这个排队是指什么? 线程级别? 争抢时间片? 如果这样 池化的时候,多线程调用不同的实例的方法,这个时候也是在争抢时间片啊.....对一对象的一个方法的调用,如果没有 synchronized 是不会有对队列那种形式的等待的吧