快手客户端二面复盘
JMM把内存抽象成主存和线程内部的工作内存,规定了八种内存操作(lock,unlock,read,wirte,load,assign,store) 并制定了一系列happensbefore规范,比如单线程中前面的操作对后面可见、锁内部的操作解锁后可见、volitaile关键字可见、传递性可见、线程启动前对启动后可见等等、只要满足这些规范,都是具有可见性的,而有序性的保证是通过禁用重排序实现的。b+
快手客户端9月8日二面
1.投的是客户端,对客户端有什么了解
2.对jmm的理解
3.多线程环境的可见性和有序性
4.线程的饱和策略?(是问拒绝策略吗? 这个不太知道)
说了线程池的拒绝策略
5.反射机制的缺点、什么场景下用反射
6.mysql底层的数据结构
7.mysql 和MongoDB 有什么区别
8.组合索引,即覆盖索引 什么时候失效
9."xxx%"为什么会导致索引失效
10.为什么要用redis ws处理逻辑时用redis存的吗?
11.kafka 存的什么数据
12.了解kafka吗 大概介绍一下kafka
13.kafka 中zookeeper起到什么作用
答案
2.对JMM的理解
JMM是java为了屏蔽不同操作系统底层的内存模型,自己抽象出来的用于java内存管理的模型,主要是为了解决在多线程并发环境下的可见性和有序性问题,保证同样的代码在不同的操作系统上在可见性上是一致的。
JMM把内存抽象成主存和线程内部的工作内存,规定了八种内存操作(lock,unlock,read,wirte,load,assign,store) 并制定了一系列happensbefore规范,比如单线程中前面的操作对后面可见、锁内部的操作解锁后可见、volitaile关键字可见、传递性可见、线程启动前对启动后可见等等、只要满足这些规范,都是具有可见性的,而有序性的保证是通过禁用重排序实现的。
3.可见性和有序性
可见性是指线程在修改变量时(局部变量除外)不会每次都从主存中读写,而是会写到线程内部的工作内存上,导致对变量的修改对其他线程不可见,为了解决这个问题,jmm使用读屏障+写屏障的方式强制线程从内存中读并及时写回内存,比如加了volatile关键字后对该变量的操作对其他线程立马可见。
有序性问题是指编译器与cpu的指令重排序可能在多线程环境下产生影响,典型的比如双重检查锁单例模式,就是为了避免有序性问题,要通过禁用指令重排序的方式解决,比如volatile、final、sychronized(加锁的话再锁内部相当于单线程,重排序也没有影响)
4.饱和策略 实际上就是拒绝策略
常用的拒绝策略
abortPolicy 拒绝并报异常
DicardPolicy 拒绝且不抛异常
DicardOledestPolicy 删除队列里最老的任务
CallerRunsPolicy 让调用者执行 实际就是直接执行了thread.run()
自定义策略
5.反射
反射应用的场景
1.Spring Bean
2.AOP
3.spi
4.动态配置
5.ORM 结果集到对象的映射
反射的缺点
1.性能差 可能堆外内存溢出
2.破坏封装
3.降低安全性
4.降低可读性 不利于维护
7.单开
8.覆盖索引失效
1. 不符合最左匹配原则
2. 对索引列用了函数
3. or
4.like "%xxx"
b+树索引是从前往后的 必须前面的确定或者有序 后面的索引才能生效
5.范围查询
13.kafak 中zookeeper起什么作用
1.管理broker 注册 剔除broker
2.topic注册
3.早起的消费者offset管理
4.controller选举
5.分区leader选取 isr维护
更多推荐
所有评论(0)