会话计数器具有HttpSessionListener和会话计数变量访问权限

Pio*_*ler 0 java concurrency multithreading counter volatile

我在Sun的"Core Servlets和JavaServer Pages vol 2"中看到了一个带会话计数器的例子.
计数器只需构建,HttpSessionListener并使用sessionCreated/ 递增/递减会话计数sessionDestroyed:

public class SessionCounter implements HttpSessionListener {
   private int currentSessionCount = 0;

   public void sessionCreated(HttpSessionEvent event) {
       currentSessionCount++;
   }
   ...
   public int getTotalSessionCount() {
       return(totalSessionCount);
   }
   ... // counter decrement, self registering in context attribute etc.
Run Code Online (Sandbox Code Playgroud)

监听器在上下文中注册自己,因此servlets可以访问它并获得计数器值.
没有同步块.
它安全吗,currentSessionCount不是volatile吗?

可以currentSessionCount缓存在CPU寄存器中,并且对于提供请求的其他线程的精确值是不可见的servlets

Mul*_*der 5

这样会很安全.

public class HttpSessionListenerTest implements HttpSessionListener {
    final private AtomicInteger sessionCount = new AtomicInteger(0);

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        sessionCount.incrementAndGet();
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        sessionCount.decrementAndGet();
    }

    public int getTotalSessionCount() {
        return sessionCount.get();
    }
}
Run Code Online (Sandbox Code Playgroud)