ServletRequestAttributes servletRequestAttributes =(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
HttpSession session = servletRequestAttributes.getRequest().getSession();
比如上面的这个代码在当前请求线程内,可以随时随地获取HttpSession,也不用把HttpSession当作函数参数到处传递啊?
[]( )二、方案一:ConcurrentHashMap
--------------------------------------------------------------------------------
过了不一会同事给了我这样一种方案。使用全局静态Map存放JdbcTemplate,key为当前线程的线程名称(唯一性)。为了避免线程安全问题,同事使用了ConcurrentHashMap。
public static ConcurrentHashMap<String, JdbcTemplate> templates = new ConcurrentHashMap<>();
![在这里插入图片描述](https://img-blog.csdnimg.cn/1576dec3d7d1455c920f731fcf4df52a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2X5q-N5ZOl5ZOl,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
如上图所示,这个方案是可以实现需求的
* `ConcurrentHashMap templates`作为一个静态成员变量,可以随时随地被引用。
* 在AClass中根据数据源配置初始化JdbcTemplate,并将其放入Map。`templates.put(Thread.currentThread().getName(),jdbcTemplate);`
* 用到jdbcTemplate的时候,随时从ConcurrentHashMap中取出来。`templates.get(Thread.currentThread().getName())`。
虽然可以实现需求但是不够好,最主要的原因是:**多线程使用一个Map,为了保证线程安全,ConcurrentHashMap使用了synchronized,所以执行效率肯定下降。就像多个人要上厕所,就一个坑,肯定有人需要等着。**
[]( )三、方案二:使用ThreadLocal
----------------------------------------------------------------------------
所以更好的方案是:
public static ThreadLocal templates = new ThreadLocal<>();
ThreadLocal通过set方法将变量放入一个ThreadLocalMap,每个线程一份有效避免多线程资源竞争(如下图)。
templates.set(jdbcTemplate); //向ThreadLocalMap中放入
感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
[外链图片转存中…(img-dQtRIiYQ-1720084661750)]