2
回答
javaweb项目使用threadlocal存储session的问题
科大讯飞通用文字识别100000次/天免费使用。立即申请   

先来看下jdk1.7 threadlocal的类注解

Each thread holds an implicit reference to its copy of a thread-local
 * variable as long as the thread is alive and the <tt>ThreadLocal</tt>
 * instance is accessible; after a thread goes away, all of its copies of
 * thread-local instances are subject to garbage collection (unless other
 * references to these copies exist).
我英语不好,自己翻译一下为:每一个线程会隐式引用一个本地线程的拷贝,而且这个threadlocal变量的生命周期和和掌握这个threadlocal的线程的时间一样,当一个线程生命周期结束后,这个threadlocal的实例的拷贝将会被回收。

那么问题来了,比如获取session的方法为SessionUtil.getSession(),通常来说用户会发送一个请求来访问需要登录的资源,这个时候处理这个请求的线程会调用getSession方法,当请求结束后,维护请求的线程也会结束,那么这个线程所持有的getSession()返回的对象也会被销毁。。那么下一次请求的线程再去调用这个getsession方法,怎么确保这个session和上一次获取的session是同一个对象,或者说属于同一个线程.因为用户被没有办法直接获取session所在的线程

<无标签>
举报
大海
发帖于2年前 2回/644阅
共有2个答案 最后回答: 2年前

访问结束Session对象并不会销毁,而是线程中的那个引用session的变量销毁了吧,session 是同一个对象是因为cookie中存储了sessionid,根据sessionid从容器的SessionManager里面获取到的session对象

首先你要明白你当前线程生命周期结束了,但是你的web应用整个进程并没有结束,所以应用所申请的内存是还在的,比如你在应用中定义一个static的map对象,不管你在哪个线程中用相同的key去存或者取,都是能取到或者存到的,当然前提是要保证线程安全,就像你在使用redis或者memcache第三方缓存服务一样,就像楼上所说session是有前端传来的sessianid保证的用户上下文,如果这个id丢失了,自然就取不到同一个session了
顶部