Java 单例servlet?

Java 单例servlet?,java,servlets,singleton,Java,Servlets,Singleton,如果我声明一个单例servlet,比如 公共静态类SomeServlet扩展了HttpServlet{ 它给出了一个错误,指出NetBeans中不允许使用static修饰符 请告诉我如何创建一个一次只允许一个客户端执行的单例servlet 提前感谢,, Mahes 静态与在任何时间点仅由一个线程执行无关 您可以将静态类作为内部类,但由于第一点,这无助于解决问题 如果我没记错的话,只有一个servlet被实例化过,所以没有必要创建单例 因此,在方法(doGet、doPost、服务或您的实现方法)上

如果我声明一个单例servlet,比如

公共静态类SomeServlet扩展了HttpServlet{

它给出了一个错误,指出NetBeans中不允许使用static修饰符

请告诉我如何创建一个一次只允许一个客户端执行的单例servlet

提前感谢,, Mahes

  • 静态与在任何时间点仅由一个线程执行无关
  • 您可以将静态类作为内部类,但由于第一点,这无助于解决问题

  • 如果我没记错的话,只有一个servlet被实例化过,所以没有必要创建单例
  • 因此,在方法(doGet、doPost、服务或您的实现方法)上进行同步更新:不会执行此操作
基于您对问题的理解(并非双关语),我怀疑这是您应该选择的解决方案。而是重新表述您的问题,以便您使用您在第一次修订问题时所述的解决方案陈述您试图解决的问题

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

  • 静态与在任何时间点仅由一个线程执行无关
  • 您可以将静态类作为内部类,但由于第一点,这无助于解决问题

  • 如果我没记错的话,只有一个servlet被实例化过,所以没有必要创建单例
  • 因此,在方法(doGet、doPost、服务或您的实现方法)上进行同步更新:不会执行此操作
基于您对问题的理解(并非双关语),我怀疑这是您应该选择的解决方案。而是重新表述您的问题,以便您使用您在第一次修订问题时所述的解决方案陈述您试图解决的问题


更新:请参阅对此答案的评论,了解为什么您确实不想爱上synchronized。您可能(例如)想要让多个servlet一次访问一个相同的功能。另外,如果在servlet级别上进行同步,则会带来严重的扩展问题。这显然是解决并发问题的错误位置。

实现
SingleThreadModel
。但请注意:它已被弃用,可能没有任何作用/意义,它是做一件愚蠢的事(很像单例)。

实现
SingleThreadModel
。但请注意:它已被弃用,它可能没有任何意义,这是一件愚蠢的事(很像单例)。

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

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

顶级声明永远不能是
静态的
静态的
意味着元素是在类级别声明的,因此它需要一个封闭的类声明


使用servlet时,通常会有一个但可能更多的servlet实例同时处理请求。因此,也许您不想在这个级别上降低并发性,或者您会使用servlet过滤器或类似Spring Security的框架来限制并发会话的数量。

顶级声明是不可能的r be
static
static
意味着元素是在类级别声明的,因此它需要一个封闭的类声明


使用servlet时,通常会有一个但可能更多的servlet实例并发处理请求。因此,也许您不想在这个级别降低并发性,或者您会使用servlet过滤器或类似Spring Security的框架来限制并发会话的数量。

我倾向于认为单例被过度使用,通常表明解决方案的基本架构存在缺陷。假设您已经做了足够的分析来证明您需要单例,您可以使用不依赖静态初始化的旧单例模式。以下是一个示例:

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方法,因为您仍然不能保证“in”中只有一个执行器线程每次使用servlet。

我倾向于认为单例被过度使用,并且通常表明解决方案的基本架构存在缺陷。假设您已经做了足够的分析来证明您需要单例,您可以使用不依赖静态初始化的旧单例模式。以下是一个示例:

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中只有一个执行线程。

对一个方法进行同步可能不一定有效,尽管如此