单例与池化之间的并发性能,到底有什么区别?

Purking 2009-11-29 10:56:24
在使用 EJB 的时候,我们知道对于 EJB 的无状态 SessionBean , EJB 容器是提供的池化管理,这样能够处理大并发的性能问题,
在使用 Spring 的时候,其 Bean 的默认配置是单例模式, 但 Spring 的优势似乎不在解决大并发访问上,
那么我想知道的是,对于 EJB 的池化管理与 Spring 的单例模式来比较,他的大并发处理优势体现在哪里?


我的理解:
我理解不了他们的本质上有什么区别, 如果说是使用单例(类中没有同步问题), 那么多个用户访问的是'同一份'内存中的字节码,
对于使用池化管理,那么多个用户访问的是不同实例的'同样内容'的存在内存中的字节码,那么处理内存中的'同一份'字节码,与处理内
存中的多个不同实例的'同样的内容'字节码相比,他们的差别在哪里?

请各位大虾帮帮小弟, 这个问题困扰我很久了, 想破头都没想通如何解释.....
...全文
333 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
临碣 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 purking 的回复:]
引用 8 楼 eastoneking 的回复:
引用 1 楼 bao110908 的回复:
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

  我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

  另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。


单例不是么?那是什么?


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

[/Quote]

那不还是 多用户访问一个地方的东西 么
Purking 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenxiaomingit 的回复:]
单例模式 好像和池化技术 没有什么关系吧 ;单例模式指的是一个类可以创建一个对象而已,很多线程同时要调用这个类的方法,当然会排队。而池化技术就是有很多对象可以同时被调用应该会快吧。
[/Quote]

请问这个排队是指什么? 线程级别? 争抢时间片? 如果这样 池化的时候,多线程调用不同的实例的方法,这个时候也是在争抢时间片啊.....

对一对象的一个方法的调用,如果没有 synchronized 是不会有对队列那种形式的等待的吧
Purking 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 eastoneking 的回复:]
引用 1 楼 bao110908 的回复:
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。


单例不是么?那是什么?
[/Quote]

单例也仅仅是 new 一次, 像 Spring 的 IOC 容器,其会在容器初始化的时候就将对象初始化,所以在访问的时候不会存在 new 的过程了;
Purking 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenxiaomingit 的回复:]
单例模式 好像和池化技术 没有什么关系吧 ;单例模式指的是一个类可以创建一个对象而已,很多线程同时要调用这个类的方法,当然会排队。而池化技术就是有很多对象可以同时被调用应该会快吧。
[/Quote]

单例的方法调用会队列, 这个还没想过,例如 Tomcat 接受到并发请求,会触发多个线程来处理访问, 如果此时使用单例模式也是同一个对象的多线程访问,多线程他们应该是存在竞争关系吧,竞争CPU的时间,我觉得和队列没什么关系;
临碣 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bao110908 的回复:]
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。
[/Quote]

单例不是么?那是什么?
shine333 2009-12-01
  • 打赏
  • 举报
回复
我的理解,上述两者的性能都在于减少了new的机会,单例只new一次,而池能够减少不必要的new。new是很花费时间的。
而单例还是非单例,本身对运行效率(如果代码线程安全)没有任何影响
portnet 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenxiaomingit 的回复:]
单例模式 好像和池化技术 没有什么关系吧 ;单例模式指的是一个类可以创建一个对象而已,很多线程同时要调用这个类的方法,当然会排队。而池化技术就是有很多对象可以同时被调用应该会快吧。
[/Quote]
单例和多线程调用时排队有啥联系??老大能解释一下
chenxiaomingit 2009-12-01
  • 打赏
  • 举报
回复
单例模式 好像和池化技术 没有什么关系吧 ;单例模式指的是一个类可以创建一个对象而已,很多线程同时要调用这个类的方法,当然会排队。而池化技术就是有很多对象可以同时被调用应该会快吧。
portnet 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 purking 的回复:]
引用 1 楼 bao110908 的回复:
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。


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


Thanks for the above answers.
[/Quote]

池中的对象是不同的内存地址。按你说的就是不同的字节码。
Purking 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bao110908 的回复:]
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。
[/Quote]

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


Thanks for the above answers.
一洽客服系统 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bao110908 的回复:]
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。
[/Quote]
  • 打赏
  • 举报
回复
单例并不是多用户访问一个地方的东西哦,并发请求时同时能访问到的是成员变量,多线程只对成员变量有侵蚀能力,对于局部变量线程不具备这种能力,因此线程访问时局部变量是隔离的,并不会互相影响。

我们所指的线程安全,是指线程对于对象的状态值(可以理解为成员变量的值)的侵蚀作用。对于局部变量而言,每个线程都是独立的访问互不影响的。

另外,在 Spring 中你没看到同步语句,这是由于 Spring 采用了 LocalThread 的类来管理多线程的同步问题。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧