Tomcat将servlet作为单例对象,然后,将此单例对象引用设置为连接线程作为局部变量。之后,每个线程都将此局部变量作为同步播放。这样对吗?
我很困惑,因为servlet是一个单例,所以只有一个实例。但规范说“不要将service()方法标记为同步,因为那时servlet容器不能使用实例池方法。”
游泳池和单身人士,细节上非常混乱。容器是否使用“volatile”关键字来保持共享的本地变量在其池中相等?
答案 0 :(得分:0)
servlet是一个单例。这意味着对该servlet的每个请求都会调用该唯一对象的service()
方法。
使service()
方法同步将正常工作,除了没有两个请求能够同时执行service()
方法:那是同步的。
因此,不是每个用户同时执行10个用户,而是现在有1个用户执行它,还有9个等待该方法返回,然后下一个执行该方法,而另外8个等待因此,如果您有并发请求,它将使servlet非常慢,并且将不足以使用您的Web服务器的资源。
因此,简而言之,您的servlet必须是线程安全的:它必须允许以安全的方式执行并发方法。