单身servlet?


1

如果我宣布样

公共静态类SomeServlet一个单身的servlet延伸的HttpServlet {.....

它给这表明修改静态这里不允许NetBeans中的错误。

请让我知道如何创建一次只允许一个客户端执行的单例servlet。

由于事先 Mahes

+1

的只有一个单身Servlet的方法是拥有一个用户。 Nuff说。 22 2月. 092009-02-22 13:40:35

6
  • 静态无关用在任何时间点只有一个线程执行。
  • 你可以拥有静态类作为内部类,但是这并不能帮助你的问题,因为第一点
  • 如果我记得正确的,只有一个servlet实例化过,所以不需要创建单例。 更新:我没有记错作为DefLog指出
  • 为此上的方法同步(的doGet,doPost方法,服务或您的实现方法)更新:不会做的伎俩。

根据您对问题的理解(无双关语意),我怀疑这是您应该选择的解决方案。而是改述你的问题,以便你用你在第一次修改问题时提出的解决方案陈述你试图解决的问题。

更新:请参阅此答案的评论为什么你真的不想为同步。您可能(例如)想要让多个servlet一次访问相同的功能。另外,如果您在servlet级别进行同步,则会引入严重的扩展问题。这绝对是解决并发问题的错误地方。

  0

在一个方法上进行同步可能不一定有效,尽管它可能会让你认为它确实有效。 22 2月. 092009-02-22 12:12:07

  0

正确 - 这就是为什么我添加了最后一段。我怀疑答案有助于解决根本问题。这是对所述建议解决方案的反应。 22 2月. 092009-02-22 12:17:55

  0

(注意:我之前的评论是对Tom的回应) 22 2月. 092009-02-22 12:18:47

  0

容器实例化了一个servlet的只有一个实例是不正确的。即使大多数容器都是这样实现的,规范并不要求它。如果有更多的请求,更重的权重容器会将一些线程分配给一个实例并实例化更多的线程。 22 2月. 092009-02-22 12:57:07

  0

感谢您的澄清。我将这个信息添加到答案... 22 2月. 092009-02-22 13:29:41

+1

好的更新。 :) 04 3月. 092009-03-04 00:06:40

+1

@DefLog:servlet规范说容器应该为每个声明只实例化一个servlet实例(除非servlet实现了SingleThreadModel接口)。 04 8月. 092009-08-04 18:23:58

+1

“如果我没有记错,只有一个servlet实例化了......”你是对的(通常)。请参阅http://stackoverflow.com/questions/1228424/configuring-tomcat-to-only-raise-one-servlet-per-application/1228599#1228599 04 8月. 092009-08-04 19:01:41

  0

@OlafKock,我要求这个答案应该重写而不创建任何更混乱。像我这样的新人肯定会受益。请为社区着想。 04 9月. 122012-09-04 05:03:50


1

实施SingleThreadModel。但请注意:它已被弃用,它可能无法做任何事情/有意义,这是一个愚蠢的事情(很像单身人士)。


3

我真的强烈反对让一个Servlet一次只能处理一个请求的想法。你应该做另一个(正确同步的类)并让你的servlet把请求放在某种执行队列中。


0

顶级声明永远不可能是staticstatic表示一个元素在类级别上声明,所以它需要一个封闭的类声明。

使用servlet通常会有一个,但可能是该servlet的更多实例同时处理请求。所以,也许你并不是真的想要降低这个级别的并发性,或者你会使用servlet过滤器或像Spring Security这样的框架来限制并发会话的数量。


-3

我倾向于认为Singletons被过度使用,并且常常指出解决方案的基本体系结构存在缺陷。假设你已经做了足够的分析来证明你需要一个Singleton,你可以使用一个不依赖于静态初始化的较旧的Singleton模式。这里有一个例子:

public SomeServlet extends HttpServlet { 

    private instance = null; 

    private SomeServlet() { 
     // Construction code here 
    } 

    public synchronized SomeServlet getInstance() { 
     if(instance == null) { 
      instance = SomeServlet(); 
     } 
     return instance; 
    } 

    // Servlet methods here 

} 

我看到,虽然两个潜在的问题:

首先,你需要一个包装的Servlet(或者只是从链的另一个Servlet中,因为Servlet容器将不知道如何对付没有私有构造。

其次,你仍然需要在servlet方法,因为你仍然不能保证,有一次是“中”在servlet只有一个执行线程同步。

  0

你可能想要谷歌“双重检查锁定是坏的Java 6”。它发现这个:http://www.ibm.com/developerworks/java/library/j-dcl.html 22 2月. 092009-02-22 15:53:01

  0

伟大的文章...讨厌的分支Java 6我几乎完全消除了从我的代码Singleton模式,但我一定会记住,以供将来升级。 23 2月. 092009-02-23 00:37:48

  0

这段代码真的很混乱。 04 3月. 092009-03-04 00:05:15

  0

在java中双重检查锁定不会中断6.引用自http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java“从J2SE 5.0开始,此问题已得到解决” 25 4月. 122012-04-25 15:20:08