更新时间:2020-02-18 10:49:06 来源:极悦 浏览3605次
有哪些集合实现,对应的线程安全集合?
主要考察集合框架的两大类:集合(collection)和图(map),集合下面主要了解list和set,如ArrayList、LinkedList、HashSet、TreeSet;map下主要了解HashMap、TreeMap。
划重点(加分项):
①线程安全集合选两个代表性的:ConcurrentHashMap和CopyOnWriteArrayList,了解它们是如何做到线程安全的。
hashmap底层结构,为什么使用链表?(hashmap是面试必考题)
HashMap的底层结构(数组)实现,一定要了解透彻,如put()、get()两块源码花点心思;
hash碰撞后产生的链表、红黑树顺带了解,有能力的最好看下源码实现(加分项)。
线程池常用参数、如何设置?
核心线程数、最大线程数、阻塞队列容量、线程空闲时间及单位、拒绝策略,每个的具体含义一定要了解。
划重点:
当线程数小于核心线程数时,创建线程。
当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
当线程数大于等于核心线程数,且任务队列已满:
若线程数小于最大线程数,创建线程若线程数等于最大线程数,看拒绝策略
如何设置具体参数值(个人经验及看法,供参考):
核心线程数=每秒需要处理的最大任务数量*处理一个任务需要的时间,业界有常用的8020原则、6040原则,实际还是要根据自己应用的承载能力来看,假设系统每秒任务数为10~100,每个任务耗时0.1秒,则需要10*0.1~100*0.1,即1~10个线程。那么corePoolSize应该设置为大于1,若根据8020原则,即80%情况下系统每秒任务数不超过20,则corePoolSize=0.1*20=2。
阻塞队列容量=核心线程数/处理一个任务需要的时间*系统允许任务最大的响应时间
最大线程数=(每秒需要处理的最大任务数量-队列容量)*每秒的线程处理任务能力,假设每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-队列容量)*(20/200),即60个线程。
阻塞队列的实现原理?
lock锁的多条件(condition)阻塞控制,基础薄弱的需要提前了解一下同步锁synchronized、lock及Condition类,这一块考验高级和中级研发人员的界限,需要挖一下源码,多用心。
加分项:另外辐射出来可能会顺带直接问你AQS,建议仔细了解其实现原理,如其内部如何利用双向链表的,重点看acquire()方法实现。
内存模型(必考题)
无论你关注jdk1.8之前还是之后,不重要,关键是能正常理解每一块的作用、是否线程共享/私有。
堆、虚拟机栈、本地方法栈、程序计数器、方法区,需要了解每一部分的作用。
划重点:
虚拟机栈包含哪些部分、程序计数器的作用这两块着重了解。
GC发生在哪一块,GC算法?
发生在堆内存,GC算法主要了解:标记清除、复制、标记整理,需要知道其执行步骤及各自的区别。
划重点:
年轻代划分成哪几部分(E、S0、S1),使用哪种算法(复制),老年代使用哪种算法(标记清除),为什么?这里需要耐心理解透彻,很容易辐射到此类问题。
事务隔离级别,默认哪一个,解释幻读、不可重复读及二者区别?
隔离级别:读未提交、读提交、不可重复读、串行化,默认是不可重复读,具体幻读问题,请参考笔者此前文章幻读、不可重复读,其中进行了详细说明。
索引失效场景、索引数据结构?
主要分为非组合索引和组合索引:
1、非组合索引主要注意or、like(若like非左模糊情形,如xxx%,则可以使用索引),索引列存在表达式、聚合函数等等;
2、组合索引主要注意是否遵循最左原则。
还有些其它小点靠大家自己去积累,笔者这会是蒙圈状态,没反应过来。
索引数据结构:主要关注B+树,花心思了解透,且需要了解聚簇索引和非聚簇索引。
加分项:InnoDB与MyisAM索引方面的区别。
数据库引擎
主要可以说说InnoDB、MyISAM这两个常用的即可,需要了解二者的区别,InnoDB支持事务,二者使用场景,二者之间如何转变。
mysql分表中间件、如何监听binlog
中间件:tddl,MyCat(其实考验你的知识储备广度,一般不要求细说中间件的实现)。
监听时可以使用duckula中间件或者binlog监听独立jar包(common-binlog-alone)。
笔者认为高级或资深人员必须要了解的知识储备:InnoDB的MVCC机制
mysql自身的并发控制如何实现的,原理主要从其新增、更新、删除三方面去了解其内部的操作过程,其版本号如何控制等等。
以上就是极悦注册机构小编介绍的“资深Java面试题目及答案”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
相关推荐
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习