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