如何实现同一用户只能存在一个实例?

将登陆用户对象放到一个static HashMap中,登陆的时候检查该MAP中是否有同名的USERNAME

放出实现代码

import java.util.*;
import javax.servlet.http.*;


public class OnlineUser implements HttpSessionListener,java.io.Serializable{
  private static ReadWriteLock lock=new ReadWriteLock();
  private static HashMap name_session = new HashMap();
  private static HashMap UserMap = new HashMap();

  public static int getUserCount(){
    lock.acquireReadLock();
    try{
      return UserMap.size();
    }finally{
      lock.releaseReadLock();
    }
  }

  public static UserForm getUser(String sessionID){
    lock.acquireReadLock();
    try{
      return (UserForm)UserMap.get(sessionID);
    }finally{
      lock.releaseReadLock();
    }
  }

  public static void addUser(String sessionID,UserForm user){
    lock.acquireWriteLock();
    try{
      //先删除前面一次登陆的该用户对象
      UserMap.remove(name_session.get(user.getLOGINNAME()));
      name_session.remove(user.getLOGINNAME());
      //再添加新的用户
      UserMap.put(sessionID,user);
      name_session.put(user.getLOGINNAME(),sessionID);
    }finally{
      lock.releaseWriteLock();
    }
  }

  public static void addUser(HttpSession session,UserForm user){
    lock.acquireWriteLock();
    try{
      //先删除前面一次登陆的该用户对象
      UserMap.remove(name_session.get(user.getLOGINNAME()));
      name_session.remove(user.getLOGINNAME());
      //再添加新的用户
      UserMap.put(session.getId(),user);
      name_session.put(user.getLOGINNAME(),session.getId());
    }finally{
      lock.releaseWriteLock();
    }
  }

  public static boolean existUserByLoginName(String LOGINNAME){
    lock.acquireReadLock();
    try{
      return name_session.containsKey(LOGINNAME);
    }finally{
      lock.releaseReadLock();
    }
  }

  public static boolean existUserBySessionID(String sessionID){
    lock.acquireReadLock();
    try{
      return UserMap.containsKey(sessionID);
    }finally{
      lock.releaseReadLock();
    }
  }

  public static void deleteUser(String sessionID){
    lock.acquireWriteLock();
    try{
      name_session.remove(UserMap.get(sessionID));
      UserMap.remove(sessionID);
    }finally{
      lock.releaseWriteLock();
    }
  }

  public static void deleteUserByLOGINNAME(String LOGINNAME){
    lock.acquireWriteLock();
    try{
      UserMap.remove(name_session.get(LOGINNAME));
      name_session.remove(LOGINNAME);
    }finally{
      lock.releaseWriteLock();
    }
  }

  public static boolean SessionExist(HttpSession session){
    lock.acquireReadLock();
    try{
      return UserMap.containsKey(session.getId());
    }finally{
      lock.releaseReadLock();
    }
  }

  public void sessionCreated(HttpSessionEvent se){
    System.out.println(se.getSession().getId()+" 登入到系统 "+new Date());
  }

  public void sessionDestroyed(HttpSessionEvent se){
    lock.acquireWriteLock();
    try{
      name_session.remove(UserMap.get(se.getSession().getId()));
      UserMap.remove(se.getSession().getId());
    }finally{
      lock.releaseWriteLock();
    }
    System.out.println(se.getSession().getId()+" 退出系统 "+new Date());
  }

  public static Iterator userMap(){
    lock.acquireReadLock();
    try{
      return UserMap.values().iterator();
    }finally{
      lock.releaseReadLock();
    }
  }
}


下面是同步锁

public class ReadWriteLock{
    private int readers=0;  //读线程计数器
    private boolean writingInProgress = false; //写操作标记
    private boolean waitingWriter = false;  //等待写操作的标记

    public ReadWriteLock(){ }

    public synchronized void acquireReadLock(){
      while(writingInProgress||waitingWriter==true){
        try{
          wait();
        }catch (InterruptedException ie) { /* ignore */ }
      }
      readers++;
    }

    public synchronized void releaseReadLock(){
      readers--;
      if (readers == 0) { //没有人在读操作,通知可能等待着的写操作线程
        //notify();
        notifyAll();
      }
    }

    public synchronized void acquireWriteLock(){
      while(readers>0||writingInProgress){
        try{
          waitingWriter = true;
          wait();
        }catch(InterruptedException ie){ /* ignore */ }
      }
      writingInProgress = true;
      waitingWriter = false;
    }

    public synchronized void releaseWriteLock(){
      writingInProgress = false;
      notifyAll();
    }
  }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值