1、知道ThreadLocal吗?讲讲你对ThreadLocal的理解 (项目中多线程并发安全问题如何解决?)
先讲作用:在同一个项目中的同一个线程范围内共享数据(一个线程存入数据,另一个线程无法读取或修改的)
防止多线程之间并发问题
再讲使用方式:
其实ThreadLocal底层使用一种Map结构,key是存储当前线程标记,value存储我们写入的值
set(Object obj) 往当前线程存入数据,底层 map.put(‘当前线程唯一标记’,obj);
Object get(): 从当前线程取出之前存入的数据,底层Object map.get(‘当前线程唯一标记’)
remove(): 移除当前线程存入的数据,底层 map.remove(‘当前线程唯一标记’)
最后讲注意事项:(ThreadLocal可能存在内存泄漏的问题(可能存在并发数据问题),怎么解决?)
在使用完TheadLocal的数据后,建议手动移除线程数据,防止内存泄漏和防止并发数据问题。
2、MySQL索引有哪些类型?
1)普通索引(INDEX):最基本的索引,没有任何限制 creata index a_index on tb_user(name)
2)唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值,一张表可用多个唯一索引。
3)主键索引(PRIMARY KEY):是一种特殊的唯一索引,值唯一,但是不允许有空值,一张表只能有一个主键索引。
4)组合索引(INDEX)/复合索引/联合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。 tb_user(name,sex,age)
5)全文索引(FULLTEXT):仅可用于 MyISAM 表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时好空间。
3、SpringMVC核心原理?执行流程?
围绕三大组件:处理器映射器(HandlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResovler)
SpringMVC的核心流程写在DispatcherServlet中的doDispatch方法里面
1)通过处理器映射器,解析request请求,查询到对应的Handler(处理器)(对应的Controller的方法)
HandlerExecutionChain handler = mapping.getHandler(request);
2)通过处理器适配器,执行刚刚找到的Handler(处理器),执行完毕后,返回ModelAndView(执行Controller的方法)
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
3)根据ModelAndView,找到对应View视图(页面/返回Json),渲染视图(如果是页面拼接路径进行转发,如果是json字符串把方法返回值转换成json字符串并写出浏览器)
view.render(mv.getModelInternal(), request, response);
4、如何防止SQL注入?
1)JDBC使用PreparedStatement(不要使用Statement),在用mybatis/mybatis-plus时,则尽量使用#{param},不要用${param}
因为PreparedStatement可以先预编译sql语句(SQL语义确定),再进行赋值,这样不会改变sql语义。
2)使用过滤器过滤用户输入的特殊符号( # > < where )
3)对请求参数字符串长度,格式进行限制
5、请说说JVM调优?( 必问 )
我在开发中一般很少需要进行JVM调优,但我了解过一点JVM调优的参数:
OOM(Out of Memeory 内存溢出)
1)设定堆内存大小(比较常用的)
-Xmx:堆内存最大限制。
2)设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代占比
-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
3)设定垃圾回收器算法
年轻代用 -XX:+UseParNewGC
年老代用-XX:+UseConcMarkSweepGC
