锁加单例:
public class Regist{private static Regist rgst=new Regist()
private Regist(){}
private int cnt=0
private int max=100
public static getRegist(){return rgst}
///设置最大上线人数
public void setMax(int max){this.max=max}
public synchronized boolean login(){
if(cnt>=max)return false
++cnt
return true
}
///用户退出时调用
public synchronized void logout(){
--cnt
}
}
有新用户要登入时,先Regist::getRegist().login()判断能否登入,返回true则表示没到用户上限,可以登入,否则表示到上限了,不能登入,用户退出时需要调用Regist::getRegist().logout()
synchronized不清楚可以百度,是种类似锁的东西。作用于方法上,相当于调用方法前先lock,调用之后unlock,其锁的对象是该方法的类对象。
线程不是太多可以用这个方法,线程太多用这个可能慢了些,好像加锁比较耗时间,如果同一个时间太多人进行登入操作,都得在那等着,一个一个进行,反应慢
用session超时的特点来实现1.用户登录,session生成 用户在线
2.用户机器断电。一定时间(这个怎么设置我就不讲了,地球人应该都知道)后session超时 通过session监听器实现 用户下线
3.用户退出 用户下线
我没真正实现过,不过我的思路是这样的:数据库用户表有字段用户名,密码,是否登录(username,password,Islogin)
默认Islogin为false,当一用户登录成功,更新Islogin字段的值为true.当统计用户在线人数,只需要用select count(*) from 用户表 where Islogin='true'即可得到在线人数。
不知道是不是正确,我也在学习当中。