钉钉一面
1、SpringBoot的优点?
1)创建独立的Spring应用程序。SpringBoot可以jar包的形式进行独立的运行,使用:java -jar xx.jar就可以成功运行项目,或者在项目的主程序中运行main函数。
2)springboot项目不需要单独下载Tomcat等传统服务器,内嵌容器,使得我们可以执行运行项目的主程序main函数,并让项目的快速运行,另外,也降低对运行环境的基本要求,环境变量中有JDK即可。
3)Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖,通过这些starter项目就能以Java Application的形式运行Spring Boot项目,而无需其他服务器配置。
4)Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽量减少。Spring Boot更多的是采用 Java Config 的方式,对 Spring 进行配置。
可参考:https://www.cnblogs.com/echola/p/10996214.html
2、ThreadLocal原理,应用场景
ThreadLocal主要用来存储当前线程上下文的变量信息,它可以保障存储进去的数据,只能被当前线程读取到,并且线程之间不会相互影响。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
ThreadLocal有哪些典型的应用场景:
1)数据库事务。通过AOP的方式,对执行数据库事务的函数进行拦截。函数开始前,获取connection开启事务并存储在ThreadLocal中,任何用到connection的地方,从ThreadLocal中获取,函数执行完毕后,提交事务释放connection。
2)web项目中,用户的登录信息通常保存在session中。做一个拦截器,把用户信息放在ThreadLocal中,在任何用到用户信息的时候,只需要从TreadLocal中读取就可以了。
ThreadLocal 内部维护了一个ThreadLocalMap 的静态内部类。ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。
3、AtmoicInteger的原理,CAS原理
cas:将指定内存地址的内容与所给的某个值相比,如果相等,则将其内容替换为指令中提供的新值,如果不相等,则更新失败。AtomicInteger的本质:自旋锁+CAS原子操作。AtomicInteger中用的就是Unsafe的CAS操作。 4、ReentrantLock,synchronized的区别
1)Synchronize是基于jvm的,ReentrantLok是基于JDK的。 2)ReentrantLock多了几条特性。等待锁的线程可终止,可实现公平。 3)ReentrantLock可实现选择性通知。synchronized中wait notify,notifyAll时是唤醒所有wait的线程。而ReentrantLock中Condition可创建多个,siginalAll时唤醒的是那个Condition实例wait的所有线程。
5、ConcurrentHashmap的底层数据结构,put操作
ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。
说明:put函数底层调用了putVal进行数据的插入,对于putVal函数的流程大体如下。
① 判断存储的key、value是否为空,若为空,则抛出异常,否则,进入步骤②