3-3安全问题
1、老师说两个线程没有共享user对象,但是他们共享了threadlocal对象了啊, 当线程1往里面存放数据,线程2也往里面存放数据, 有可能会出现线程1拿到的是线程2的用户数据吧。 因为threadlocal只有一个。
解决:每次设置前,先清除之前的数据, 可以吧?这样可以保证一致性吧。
//将数据存到threadlocal中
UserContextHolder.holder.remove();
UserContextHolder.holder.set(user);
2、老师讲的这个用法, 将用户的数据获取到后封装到各自的user对象中, 然后存到threadlocal中, 那和session的用法不一样吗, session,每次浏览器会发送cookie值,每个用户的cookie值肯定不一样啊, 也不会出现问题的吧。 session的存入前,也可以加入清除之前session的记录啊。
正在回答 回答被采纳积分+1
追问:
3、但是我发现threadlocal比session有一个好处, 就是对数据的更新后,threadlocal里面的数据也会更新,但是session 就不会。 比如
//读取localhost中的对象
User user=UserContextHolder.holder.get();
System.out.println("service2:"+user.name);
user.name="更名字";
new Service3().process();
业务3调用的方法, 是更新后的数据, 如果是session 的话, 获取到的对象,一般用于判断, 如果要更新的话,要重新set到session中, 那么重新set进去,就可能出现了线程不安全的问题了, 线程1重新set,此时线程2进来,存储数据,因为session是服务器的一片空间吧, 会时候会导致线程不安全。 清除不管用吧, 用户1,set进了session中的名字user的空间内, 用户2进来也是存入session中的user空间内, 会覆盖吗?
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星