Singleton servlet?

时间:2009-02-22 11:51:30

标签: java servlets singleton

如果我声明像

这样的单件servlet

public static class SomeServlet扩展了HttpServlet {.....

它给出了错误,指示NetBeans中不允许使用修饰符静态。

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

先谢谢, Mahes

5 个答案:

答案 0 :(得分:6)

  • static 与任何时间点只有一个线程执行无关。
  • 你可以将静态类作为内部类,但由于第一点
  • ,这对你的问题没有帮助
  • 如果我没记错,只有一个servlet被实例化,所以不需要创建单例。 更新:我记不清正确,因为DefLog指出
  • 因此同步方法(doGet,doPost,服务或您的实现方法)更新:不会执行此操作。

根据您对问题的明确理解(没有双关语意),我怀疑这是您应该选择的解决方案。而是重新解释您的问题,以便您使用您在问题的第一个修订版中说明的解决方案来说明您尝试解决的问题。

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

答案 1 :(得分:3)

我非常强烈反对制作一个一次只能处理一个请求的Servlet的想法。您应该创建另一个(正确同步的类)并让您的servlet将请求放入某种执行队列中。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

顶级声明永远不会是staticstatic表示在类级别声明了一个元素,因此它需要一个封闭的类声明。

对于servlet,通常会有一个但可能更多的servlet实例同时处理请求。所以,也许你真的不想在这个级别减少并发性,或者你会使用servlet过滤器或类似Spring Security的框架来限制并发会话的数量。

答案 4 :(得分:-3)

我倾向于认为单身人士过度使用,并且经常表明解决方案的基本架构存在缺陷。假设您已经做了足够的分析来证明您需要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中一次只有一个执行程序线程。