美团开发岗社招面试技术问题汇总
Map接口有哪些实现
hashmap、linkedhashmap、treemap
hashmap线程安全吗,会有什么问题。怎么实现一个线程安全的map
hashtable、concurrenthashmap、collections.synchronizedMap
linkedhashmap的应用场景
LRU
线程池的参数,他的流程是怎么样的
核心线程、最大线程、等待队列、拒绝策略、非核心线程存活时间
先请求过来创建核心线程,等核心线程创建达到指定值将请求放入等待队列,如果等待队列
满了就创建非核心线程,等线程数达到最大线程就执行拒绝策略,等线程执行完毕,非核心
线程空闲到指定时间就删除非核心线程
synchronized和reentranklock的实现和区别,synchronized是JVM层面的实现,锁类的话是monitorenter,monitorexit两个指令,锁方法的话是用ACC_synchronized标识来实现,在JDK1.6对synchronized进行了优化,有锁消除、
锁粗化、轻量级锁、偏向锁、重量级锁等实现。偏向锁的话就是在MarkWord上有一个当前持有线程的id和锁标识位,先检查锁标识位是不是偏向锁,然后是否指向自己线程,这样就少去了加锁步骤的开销,不是的话等持有线程运行到安全点会进行锁的膨胀,在MarkWord中会有一个指针指向持有线程栈帧中的对象,虽然有此时再有第三个线程过来或者自旋一定次数仍未获得轻量级锁,此时就要膨胀为重量级锁了,此时指针会指向monitor对象,其他线程想获得这个锁会阻塞。
reentranklock的底层是AQS,而AQS是CLH队列的增强,CLH底层实现了一个虚拟节点的双向链表,每个节点会自旋查询前面一个节点的情况。AQS在此基础上做了增强,支持可重入、可中断、不是一直自旋支持阻塞、支持非公平、支持独占和共享。reentranklock默认是非公平可重入锁。(这里我面试的时候直接就奔原理去了,上来就说了synchronized的原理,等说到reentranklock还没开始面试官就让我停了,我后来复盘才意识到,他仅仅是让我说区别罢了,
那么补充下区别)
怎么实现一个不可重入的锁
mybatis的缓存实现,如果数据库进行修改了缓存怎么办
sqlsession一级缓存和二级缓存。就一级缓存而言,数据库进行修改会导致一级缓存失效,
就二级缓存而言,因为他的作用域是namespace,如果有连表查询,而这个连表查询是写在某一个namespace里的,会导致脏数据的产生。
#美团##面经##社招#