一.介绍
暑期实习的面试,看了一下考并发包知识比较多,正好我借机复习一下JUC
二.正文
一面 2h
实习项目难点,搭建框架时候的难点
略
项目开发过程中遇到的难点,数据标注平台开发 中的逻辑,怎么发现有问题的,标注批次计数?
略
最近怎么学的 并发,博客,怎么保证博客写的是对的,没有看书吗
略
4.sychronized底层原理? monitor对象头里面是什么?锁升级?
每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权
reetrantlock底层原理?AQS的等待队列 线程安全吗?
5.volatile,CAS
可以看我博客的文章
6.为什么要需要 并发安全处理
多个执行线程共享一个资源的情景,是最常见的并发编程情景之一。为了解决访问共享资源错误或数据不一致的问题,人们引入了临界区的概念:用以访问共享资源的代码块,这个代码块在同一时间内只允许一个线程执行。
8. 事务的特性,解释
9.事务隔离级别
读未提交,读已提交,可重复读,可串行化
10.存储引擎?Inodb,myisam区别? inodb索引,myisam索引?
-
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
-
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
-
InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
-
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
-
Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
-
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
-
InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
11.*为什么主键要自增,叶子节点key为什么有序?
从业务上说:
在设计数据库时不需要费尽心思去考虑设置哪个字段为主键。然后是这些字段只是理论上是唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说是唯一的,但实践中可能会出现重复的 情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性约束。
从技术上说:
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。 总的来说就是可以提高查询和插入的性能。
对InnoDB来说
1: 主键索引既存储索引值,又在叶子节点中存储行的数据,也就是说数据文件本身就是按照b+树方式存放数据的。
2: 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;
聚簇索引中,N行形成一个页(一页通常大小为16K)。如果碰到不规则数据插入时,为了保持B+树的平衡,会造成频繁的页分裂和页旋转,插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID)。
故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的。
12.最左前缀匹配原则?
13.算法题,打印出一个字符串中所有的回文子串
略
二面:2h(4.11)
程序计数器工作原理?作用?
PC用于存放指令的地址。比如说有两个线程A和B,线程A暂时挂起,CPU去执行其他代码,等到切回线程A时,能定位到下一行执行代码的位置,这就是程序计数器的作用。
JVM调优经历dump之类的操作?
垃圾收集器CMS工作原理? Concurrent体现在哪?用户停顿?垃圾收集为什么要开启多个线程?
CMS使用标记清除算法进行垃圾回收,Concurrent体现在和用户线程并发执行,获得最短停顿时间,开启多个线程肯定是为了利用多核CPU的性能,提升效率
知道哪些锁?事务隔离级别? 可串行化怎么实现的?
这题如果是数据库方面那就是四种 IX IS X S 可以看本人文章 MYSQL相关
可串行化实现:读数据加互斥锁
索引结构?为什么使用B+索引?
1.单次请求涉及的磁盘IO次数少(出度d大,且非叶子节点不包含表数据,树的高度小);
2.查询效率稳定(任何关键字的查询必须走从根结点到叶子结点,查询路径长度相同);
3.遍历效率高(从符合条件的某个叶子节点开始遍历即可);
查询性能优化?Explain里都能获取什么信息
本人文章 慢查询优化
concurrentHashMap并发原理?扩容机制?
从JDK1.7版本的ReentrantLock+Segment+HashEntry ; JDK1.8版本中synchronized+CAS+HashEntry+红黑树。
线程池?知道哪些具体的线程池?如果自己实现一个线程池都要考虑哪些参数?拒绝策略有哪些?
本人文章有
AQS等待队列为什么设计成双向链表?
在队列同步器中,头节点是成功获取到同步状态的节点,而头节点的线程释放了同步状态后,将会唤醒其他后续节点,后继节点的线程被唤醒后需要检查自己的前驱节点是否是头节点,如果是则尝试获取同步状态。
所以需要设计成双向链表
Arraylist和Linkedlist区别
一个底层是数组,一个是链表,可以侧重说一下 链表和数组的区别