我有一个名为counter的课程。它看起来像这样:
public class Counter {
private int count;
public Counter() {
count = 1;
}
public int getCount(){
return count;
}
public void incrementCount(){
count++;
}
我想在tomcat应用程序的每个用户之间共享一个这样的实例。 因此,用户1和用户2都会将getCount()视为相同的值。 假设有一个技术原因导致我无法存储和读取数据库。
有什么建议吗?
感谢。
答案 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优化的