一个同步 锁的案例

本文介绍了一个用于自动扫描和管理Web应用中HttpSession的Java类——SessionScanner。该类通过实现HttpSessionListener和ServletContextListener接口,并利用Timer定期检查每个会话的有效性。一旦发现某个会话已闲置超过设定的时间限制,则会销毁该会话并从会话列表中移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.web.listener.exapmle;


import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Timer;
import java.util.TimerTask;


import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


public class SessionScanner implements HttpSessionListener,ServletContextListener {


private List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());
private Object lock = new Object();
public void contextInitialized(ServletContextEvent sce) {

Timer timer = new Timer();
timer.schedule(new MyTask(list,lock), 0, 30*1000);
}

public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session + "被创建了!!");
synchronized (lock) {  //锁旗标
list.add(session);
}
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println(se.getSession() + "被销毁了");
}


public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}


class MyTask extends TimerTask{


private List list;
private Object lock;
public MyTask(List list,Object lock){
this.list = list;
this.lock = lock;
}
@Override
public void run() {
System.out.println("定时器执行!!");
synchronized (this.lock) {
ListIterator it = list.listIterator();
while(it.hasNext()){
HttpSession session = (HttpSession) it.next();
if((System.currentTimeMillis()-session.getLastAccessedTime())>30*1000){
session.invalidate();
//list.remove(session);  //并发修改异常
it.remove();
}
}
}
}
}


/*class MyList{

Object arr[] = new Object[10];
public void add(Object obj){  //session
if(arr[0]==null){

arr[0] = obj;
}

}
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值