Anj*_*ana 1 performance struts synchronization servlets
如果在struts synchronized的service()方法中有一个块ActionServlet,那么如果多个请求/线程是一个拥有大量命中的繁忙站点,它将如何工作.
每个线程是否会等待下一个另一个线程从同步块释放锁定?会不会造成响应延迟
小智 5
不要同步servlet的服务方法.
如果您同步serviceservlet 的方法,实际上您正在为该Servlet实例一次为一个线程进行"访问保留".
Struts ActionServlet类是一个HttpServlet基本的doGet和doPost方法在这里感兴趣.如果我们要谈论Struts,过程方法是主要的切入点,但同样的原则适用于所有方法,就像它对一般service方法一样.
这个想法是这样的.
当你在servlet中声明一个servlet时web.app,servlet容器(例如Tomcat)将只创建该servlet的一个实例.这意味着只有一个实例可以为所有请求提供服务.
如果有更多请求同时到达,则每个请求线程都会在该service方法中获得机会,因为没有强制执行同步.
如果您有10个请求线程,则每个线程将在该service方法中并发执行.这通常是安全的,因为在该service方法中完成的处理不涉及与其正在处理的当前请求相关的任何状态.如果向servlet添加状态,则会遇到问题.这是一篇有关该主题的更多细节的文章.
现在回到Struts.
支柱使用称为图案前端控制器与ActionServlet被该控制器.这将依次将特定请求委托给Action其配置(aka struts-config.xml)中指定的特定类.
所有传入的请求都通过这里.如果此时放置同步(Struts process方法或servlet service方法更高),则一次为一个线程保留servlet.对于struts,您一次保留对单个线程的所有请求处理.
这意味着如果10个请求同时到达,在没有同步的情况下都可以并行执行,而在同步请求2的情况下,必须等到请求1完成,3等待2等等(即请求是顺序处理).这意味着表现不佳.
也许对于提出请求1的幸运用户来说,没有性能影响,但是10号将不得不等待.那么100号怎么样?200?
如果您在编写应用程序时考虑到线程安全性,则无需同步入口点.如果您的应用程序属于您无法避免同步的类型,则同步入口点将降低性能.
PS只是另外一件事.如果您正在考虑在流程中将同步降低,即Action类,请注意它们也不是线程安全的,并且Struts框架中只有一个实例.
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |