使用Tomcat在所有用户之间共享类实例

时间:2011-04-14 19:48:18

标签: java servlets

我有一个名为counter的课程。它看起来像这样:

public class Counter {
  private int count;

  public Counter() {
    count = 1;
  }

  public int getCount(){
    return count;
  }

  public void incrementCount(){
    count++;
  }

我想在tomcat应用程序的每个用户之间共享一个这样的实例。 因此,用户1和用户2都会将getCount()视为相同的值。 假设有一个技术原因导致我无法存储和读取数据库。

有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:4)

Just create one并在服务器启动期间将其存储在应用程序范围内。

@WebListener
public class Config implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("counter", new Counter());
    }

    // ...
}

这种方式在每个servlet中都可用,如下所示:

Counter counter = (Counter) getServletContext().getAttribute("counter");
// ...

在每个JSP中如下:

<p>The count is ${counter.count}</p>

另见:


无关到具体问题,你的计数器不是线程安全的。我建议使用AtomicInteger代替int

public class Counter {
  private AtomicInteger count = new AtomicInteger();

  public Counter() {
    count.incrementAndGet();
  }

  public int getCount(){
    return count.get();
  }

  public void incrementCount(){
    count.incrementAndGet();
  }
}

答案 1 :(得分:2)

您可以使用Singleton模式。

试试这个:

public class Counter {
private int count;
private static Counter instance = null;
private static Object lockObj = new Object();



private Counter() {
count = 1;
}

public static Counter Instance(){
 synchronized(lockObj){
     if(instance == null){
        instance = new Counter();
     }
 }

 return instance;
}

public int getCount(){
return count;
}

public void incrementCount(){
count++;
}
}

您可以使用代码中的某个位置:Counter.Instance().getCount()

答案 2 :(得分:2)

使用适当锁定在Java中工作的单例:

public class Counter {
  private AtomicInteger counter = new AtomicInteger(0);

  private static class Initilizer {
    private static Counter instance = new Counter();
  }

  private Counter() {}

  public Counter instance() { return Initilizer.instance; }

  public int getCount() { return counter.get() }
  public void increment() { counter.incrementAndGet(); }

}

得到计数:Counter.instance().getCount()
增量:Counter.instance().increment()

2个答案之间的区别在于同步和单例初始化,它是针对java优化的