常见知识点总结
最左匹配原则
java内存模型
volatile详解
单例模式
偏向锁、轻量级锁、重量级锁的升级以及区别 https://blog.csdn.net/u012722531/article/details/78244786
synchronized的JVM底层实现(很详细 很底层)
代码块同步是使用monitorenter和monitorexit指令实现, monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处, JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个 monitor 与之关联,当且一个monitor 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁。
Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference
关于表单重复提交问题:
1. 在第一次显示页面的时候,随机制作一个标记token(如时间戳),然后把token放入session和hidden中;
2. 当点击提交按钮的时候,获取session和的token和hidden中的token,如果session中的token不为null,则比较两个token是否一致;
3. 如果两个token一致,受理请求,并移除session的token属性;
4. 如果不一致,或者session的token为null,则不受理请求
1. 在第一次显示页面的时候,随机制作一个标记token(如时间戳),然后把token放入session和hidden中;
2. 当点击提交按钮的时候,获取session和的token和hidden中的token,如果session中的token不为null,则比较两个token是否一致;
3. 如果两个token一致,受理请求,并移除session的token属性;
4. 如果不一致,或者session的token为null,则不受理请求
SpringMVC的工作流程
1. 用户发送请求至前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3. 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4. DispatcherServlet调用HandlerAdapter处理器适配器
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6. Controller执行完成返回ModelAndView
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9. ViewReslover解析后返回具体View
10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11. DispatcherServlet响应用户
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3. 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4. DispatcherServlet调用HandlerAdapter处理器适配器
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6. Controller执行完成返回ModelAndView
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9. ViewReslover解析后返回具体View
10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11. DispatcherServlet响应用户
MySQL 百万级分页优化(Mysql千万级快速分页)
怎样实现同一个账户同一时间只能在一个终端登录
找出第K大的数
接口和抽象类应用场景
首先 类描述的是 这个东西是什么(强调所属)?包含了静态属性,静态行为 ,属性和行为。
而接口 描述的它能做什么事儿(强调行为)? 只是 静态常量属性 和 行为
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
如果你想实现多重继承,那么你必须使用接口。
由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
-
抽象类表示共有许要实现的方法 接口用来特定类有需要才实现 人都会吃饭 但有的人抽烟
-
抽象类是用来捕捉子类的通用特性的
-
抽象类是 is a关系;而接口是has a关系
-
看看jdk的api会发现大部分接口都是able结尾的,表示一种能力。马士兵曰过:当你不知道用抽象类还是接口好时就用接口