本文首发于cartoon的博客
转载请注明出处:cartoonyu.github.io/cartoon-blo…java
java
-
对synchronized的了解git
- java的一个关键字,用于重量级锁的设定
- 利用synchronized关键字,能够实现对互斥资源的访问
- 做用范围
- 普通方法,锁的粒度为当前对象
- 静态方法,锁的粒度为当前类的class对象
- 代码块,锁的粒度为括号内使用的对象
-
多线程的同步机制github
- 使用同步代码块synchronized
- 经过标志位轮询访问临界资源
- 经过Condition以及lock对资源的锁定以及释放
- 经过阻塞队列BlockQueue(生产者/消费者)
-
threadLocal的概念以及使用场景redis
- 每一个线程都能拥有该变量的独立副本
- 内部经过ThreadLocalMap进行值的存储以及读取
- 初始容量为16
- 负载因子为2/3
- 经过再hash法解决hash冲突
-
final,finally,finalize的区别算法
- final为不可变修饰词,用于声明属性,方法或类不可变
- finally为异常捕获机制一部分,老是会被执行。若try或catch有return语句,finally早于此return语句执行
- finalize为Object方法,调用此方法能够实现资源的回收,可是回收时间由JVM决定
-
java注解的做用spring
- 生成文档
- 完成特定的标识(@Service等)
- 在编译时进行格式检查(@Override)
-
java集合间的区别sql
- set与list都只含单个元素,而Map含有key-value对
- Map将entry数组置为null,就是set,因此set内元素是无序的,list元素是有序的
-
BIO NIO AIO的区别数据库
- BIO
- 同步阻塞
- 线程阻塞进行运算后返回结果
- NIO
- 同步非阻塞
- 请求共用一个线程进行处理
- 线程会直接返回结果到请求
- AIO
- 异步非阻塞
- 线程处理后会经过回调返回结果
-
java反射机制的理解编程
- 做用
- 在程序运行中,动态获取对象所属类,属性以及方法等信息
- 在程序运行时,动态改变对象属性
- 动态代理以及静态代理
jvm
- 怎么判断对象是否可回收?
- 引用计数法
- 可达性分析算法(GC ROOT)
- java内存区域划分
- 运行时数据区域
- 线程共享
- 方法区
- 栈
- 线程隔离区
- 虚拟机栈
- 本地方法栈
- 程序计数器
数据库
- MyBatis分页方式以及区别
- 逻辑分页
- 数组分页
- RowBounds分页
- 物理分页
- sql分页
- 拦截器分页
- 数据库事务特性以及隔离级别
- 特性
- 原子性(Atomicity)
- 事务执行结果是一致的,成功或者回滚
- 一致性(Consistency)
- 事务执行先后数据库状态不受影响
- 隔离性(Isolation)
- 事务间操做相互独立
- 持久性
- 事务执行产生的结果是永久存储下来的
- 隔离级别
- read uncommitted
- 读取事务未提交的数据
- read commited
- 屡次查询某一数据结果不一致
- repeatable
- 同时修改同一元素形成事务提交结果发生误差
- serializable
- 事务的顺序执行
- redis的数据类型以及底层数据结构
- string
- 经过DDS(简单的动态字符串)实现
- DDS的实现经过双端链表实现
- hash
- 压缩列表(数据量较小)
- key-value对少于512个且全部键对大小都要小于64字节
- 散列表
- 链地址法解决冲突
- set
- 有序数组
- 数据都是整数
- 元素个数不超过512个
- 散列表
- list
- 压缩列表
- 双循环链表
- 全部数据大小小于64字节
- 数据个数小于128个
- 有序集合
- 压缩列表
- 相似于数组,存储空间是连续的,可是元素所占空间不惟一
- 双循环链表
- 缓存穿透的概念,解决方法
- 缓存穿透是指请求访问不存在的key,请求穿透到DB,流量大会形成DB崩溃
- 解决方法
- 采用布隆过滤器或者BitMap对请求进行过滤
- 缓存雪崩的概念,解决方法
- 大量key设置统一过时时间,形成瞬间DB访问量过大
- 解决方法
- key的过时时间用随机数进行设置
- 缓存击穿的概念,解决方法
- 存在key在缓存失效的瞬间被大量请求访问,形成DB请求量大
- 解决方法
- 设置短时间key替代原始key
- key再生成后删除短时间key
spring
- AOP,IOC的概念
- AOP
- AOP面向切面编程,它将本来纵向的程序看做成一个个切面的组合,是OOP的补充
- 动态插入执行逻辑到原有执行流程中
- 通知(Advice):具体实现逻辑
- 链接点(JoinPoint):使用通知的位置
- 切入点(PointCut):指定使用通知的链接点位置
- 切面(Aspect):通知与切入点集合
- 引入(introduction):添加新方法属性到现有类中
- 目标(target):被通知的对象
- 代理(proxy)
- 静态代理
- 动态代理
- 织入(weaving):将切面引用到目标对象生成代理对象的过程
- IOC
- 我把IOC称做为控制反转或者依赖注入,IOC是Spring的核心思想,它使调用者不用管理对象的生存周期以及具体实现,可以更加注重于业务逻辑的实现。
- 在平时实际开发中,我一般使用向上转型的对象完成业务逻辑,这样我以为能使对象中的耦合度下降,并且在代码重构的时候可以轻易切换实现类。
- Spring bean的做用域
- singleton
- prototype
- session
- request
- global session
- Spring bean是线程安全吗?
- prototype,request每次被调用都会建立新对象,不存在线程问题
- singleton,session,globalSession会形成线程间竞争,无状态bean是线程安全的,有状态beanSpring经过ThreadLocal进行解决
- spring mvc的执行流程
- 请求经过http到达后端,由DispatcherServlet进行分发
- DispatchServlet经过HandlerMapping查找处理的Controller,中间或者会有过滤器等进行处理
- 若是在查找过程当中发生错误,HandlerExceptionResolver会返回一个HandlerExecutionChain对象到DispathchServlet
- 请求正确分发到Controller,Controller调用Service以及Repository等进行处理,调用RequestAndViewNameResolver处理后返回ModelAndView对象到DispatchServlet
- DispatchServlet根据返回的ModelAndView对象,将对象交给ViewResolver组件进行视图的渲染,若是在语言上有特殊要求,渲染会调用LocaleResolver以及ThemeResolver进行国际化的适配
网络
-
Session与cookie的区别后端
- cookie存储在客户端,session存储在服务器
- cookie只能存储字符串,session能够存储任意对象
- cookie的存储大小受客户端影响,大小为4KB,session存储大小不受影响
- 后端获取cookie经过http报文中的cookie字段获取,session则经过cookie中的sessionId标识寻找
-
session的工做原理
- session是存储在服务器端的一种标识客户端的数据结构
- 用户请求到达后台,后台检测是否有sessionId字段的存在
- 有的话,校验字段是否合法
- 没有的话,建立新session并返回对应sessionId到客户端
-
TCP与UDP区别
- TCP面向链接,UDP不面向链接
- TCP有拥塞控制,UDP没有拥塞控制
- TCP资源开销大,UDP资源开销小
- TCP只支持一对一,UDP支持一对多
- TCP提供可靠传输,UDP尽量交付
- TCP面向字节流,UDP面向报文
-
tcp粘包的缘由以及解决办法
- 缘由
- 不一样数据包在到达接收方时首尾部粘在一块儿
- 解决方法
- 在每一个tcp报文首部添加报文长度
- 在报文的首部或者尾部设置特殊的符号位标识
-
tcp的三次握手与四次挥手
- 三次握手(链接过程)
- 一次握手(客户端发起)
- 建立TCB
- 发送SYN=1,seq=x
- 进入SYN-SENT
- 二次握手(服务器发起)
- 发送ACK=1,syn=1,ack=y+1,seq=x+1
- 进入SYN-RCVD
- 三次握手(客户端发起)
- 发送ACK=1,seq=x+1,ack=x+1
- 进入ESTABLISHED
- 四次挥手(结束链接过程)
- 一次挥手
- 客户端发送FIN=1,seq=u为内容的请求报文
- 客户端进入FIN-SENT-1状态
- 二次挥手
- 服务器端发送ACK=1,seq=v,ack=u+1为内容的确认报文
- 服务器端进入CLOSE_WAIT
- 客户端进入FIN-SENT-2状态
- 三次挥手
- 服务器端发送FIN=1,seq=w,ACK=1,ack=u+1为内容的释放报文
- 服务器端进入LAST_ACK状态
- 四次挥手
- 客户端发送ACK=1,ack=w+1,seq=u+1为内容的确认报文
- 客户端进入TIME_WAIT状态,等待2MSL后关闭链接
- 服务器端接受报文后关闭链接
设计模式
- 抽象工厂与简单工厂的区别
- 抽象工厂定义建立产品的大概流程,子工厂经过继承抽象工厂负责具体产品的建立,产品种类的增长不须要改变抽象工厂的代码逻辑
- 简单工厂负责具体产品的建立,产品种类的增长须要改变建立的逻辑
算法
- 快速排序实现
- 主要采用分治的思想
- 定义左右指针遍历元素(左右指针的初始值为边界)
- 循环遍历数组(左指针小于右指针)
- 循环遍历左指针直到元素大于右指针指向的元素
- 交换左右指针的元素值
- 循环遍历右指针直到元素小于小指针指向的元素
- 交换左右指针的元素值
- 返回左指针的值做为中线
- 分别递归中线左右,依据2,3的步骤进行处理