package syidt.strutsweb.cms.sessioncounter;/**
 * <p>Title: idtcms</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: **软件</p>
 *
 * @author not attributable
 * @version 1.0
 */
public class OnlineCounter {
    private static long online = 0;
    public static long getOnline() {
        return online;
    }
    public static void raise(){
        online++;
    }
    public static void reduce(){
        online--;
   }
}package syidt.strutsweb.cms.sessioncounter;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * <p>Title: idtcms</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: **软件</p>
 *
 * @author not attributable
 * @version 1.0
 */public class OnlineCounterListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent hse) {
        OnlineCounter.raise();
    }
    public void sessionDestroyed(HttpSessionEvent hse) {
        OnlineCounter.reduce();
        System.out.println("Destory Session"); 
    }
}
  <listener>
    <listener-class>syidt.strutsweb.cms.sessioncounter.OnlineCounterListener</listener-class>
  </listener>如上实现.但为什么在线人数会显示出负数.并我己设置TOMCAT...  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>

解决方案 »

  1.   

    sessionCreated和sessionDestroyed方法加上synchronized在没家同步以前,如果当前在线人数为count=0,现在有两个人同时进入sessionCreated方法,同时对同一个数值加一,结果只加了一,在线人数变成count=1,本应该是2.
    而当两个人不在同一时间离开的时候,对count进行了两次减1,那么count=-1
      

  2.   

    public class OnlineCounterListener implements HttpSessionListener {
        public synchronized void sessionCreated(HttpSessionEvent hse) {
            OnlineCounter.raise();
        }
        public synchronized void sessionDestroyed(HttpSessionEvent hse) {
            OnlineCounter.reduce();
            System.out.println("Destory Session"); 
        }
    }
    不会还不明白吧