面试题1
2020-07-13 15:15:00 0 举报
AI智能生成
登录查看完整内容
面试题
作者其他创作
大纲/内容
重写run方法
继承tread类
实现runnable接口
实现call方法
有返回值
通过callable和futuretask创建线程
创建单线程线程池
newsinglethreadexecutor
创建固定数量线程的线程池
newfixedtreadexecurtor
创建可缓存线程池
newcachethreadexecutor
支持定制和周期性执行线程
创建无限制线程池
newschdulethreadexecutor
executros工具类
核心线程数
corepoolsize
最大线程数
maxinumpoolsize
线程超过核心线程数时空闲线程时间
keepalivetime
时间单位
unit
未执行runnable的任务队列
workqueue
线程创建工厂
threadfactory
线程队列满了 工作队列也满了时候的处理方法 用于处理异常
handler
子主题
threadpoolexecutor工具类
线程池
四种创建方法
对变量操作不依赖当前值
保证可见性 不保证原子性
变量没有包含在具有其他变量的表达式中
:jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。
禁止指令重排
强制缓存修改到主存中
写操作会导致其他cpu中的缓存无效
效率最低 查询加上共享锁和拍他锁
读写操作互相阻塞
可串行读
serializble
postgres默认隔离级别
读已提交
read commit
可重复读
mysql的默认隔离级别
repeatable
读未提交
read uncommit
事务隔离级别
使用条件
volatile
线程
当前方法有事务就加入一个事务
没有就创建一个事务
required
不支持事务 如果当前有就挂起事务
not supported
新建一个事务 如果当前存在事务就挂起事务
事务提交回滚不影响挂起事务
requireds new
强制当前方法存在事务
没有就抛出异常
mandatory
不能存在事务
存在就跑出异
never
存在事务就嵌套一个子事务子事务提交和父事务没有关系 父事务影响子事务
nested
事务的传播机制
父节点只起查找运用
子节点构成有序链表
b+tree
mysql索引
提供acid事务支持
行级锁和外检约束
大数据容量的数据库系统
innodb
默认引擎不支持事务
不支持行级锁和外键
myicsm默认引擎
所有数据存在内存中
处理速度快
memorty
jdbc
odbc调用本地数据库代码
jdk标准api
执行效率低
网络应用不合适
jdbc调用传给odbc
jdbc-odbc
需要本地数据库驱动
不适合网络应用
本地api驱动
jdbc先把对数据库的访问传给网络上的中间件
中间件在调用数据库
数据库server
中间件
网络协议驱动
直接把jdbc转换为符合熟即可系统的请求
可以在直接在数据库和服务器驱动
不同数据库需要不同的驱动
本地协议驱动
jdbc驱动
JDBC-ODBC bridge plus ODBC drive
JDBC-ODBC bridge plus ODBC
Pure Java Driver for Database Middleware:
Pure Java Driver for Database Middleware
驱动类型
mysql
用户发送请求到dispatcherservlet
dispatcherservlet收到请求调用handlermapping处理映射器
handlermapping根据请求的url找到具体地处理器
生成处理器对象一处理器拦截器一并返回给dispacerservlet
dispatcherservlet通过handleradapter处理器适配器调用处理器
执行处理器controller
controller执行完成返回modelandview
handleradapter将controller的执行结果返回给dispactherservlet
dispacterservlet将modelandview传给viewreslover视图处理器
viewreslover解析后返回具体view
dispatcherservlet对view进行渲染,将模型数据填到视图中
dispacterservlet相应用户
spring mvc请求流程
spring
实例变量线程不安全
不用实例变量
不安全
servlet是否线程安全
单例模式
new一个目标对象
new一个invocationhandler将目标set进去
通过creatproxy创建代理对象强转为目标加快对象即可使用
proxy
jdk动态代理
父类出现的地方子类也可以出现
根据里式替换原则llsp
cglib动态代理
cglib需要一个第三者分发请求
jdk分发给目标对象
cglib最终分发给自己 通过method编号完成调用
区别
动态代理
业务类型需要一个interface
interface
proxy类是动态产生的 调用proxy.newproxyinstance()方法时产生一个proxy类的实例
对业务委托类的每个方法现在proxy类里面都不用静态显示
method
这个类先调用invoke方法
invocationhandler
重写invoke方法
实现invocationhandler接口
proxy.newProxyinstance()
method.invoke
基础是反射机制
jdk
继承 生成一个子类,覆盖其中的方法实现增强
继承 不能用代理final方法
cglib
动态代理2
实现类用jdk
不是实现类用cglib
代理模式
增加和删除观察者
抽象主题
subject
具体观察者
具体主题
concretesubject
定义一个更新接口,是的在主题更改时通知自己
抽象观察者
observer
实现抽象观察者的更新接口,等到注题更改时通知更新自身状态
concreobsever
观察者模式
定义一系列算法封装起来,使他们可以互相替换
策略模式
设计模式
string
list
zset
set
dict
redis数据结构
对应16383分成几个槽
节点和自身维护槽的映射关系 不需要客户端或代理服务器
支持节点,槽与键直接的映射查询,用与路由数据,用与数据路由在线机器伸缩等场景
虚拟槽分区(槽:slot)
除了计算存储数据的key的hash之外还要计算节点的hash
在存储时选择一个跟key的hash接近的节点存储进去
将物理节点通过hash运算得到其hash值,数据的key计算出来以后与节点的hash值进行比较,觉得房子那个节点中
几个虚拟节点代表一个物理节点
虚节点
一致性哈希
redis
当前线程锁执行的字节码行号只是器
通过改变程序计数器的值来选取下一条需要执行的字节码指令
每个线程都有唯一的程序计数器
程序计数器
线程私有 生命周期与线程相同
方法执行时创建一个栈帧 方法调用完成的过程就是栈帧从虚拟机中入栈到出栈的过程
栈帧是方法运行的基本数据结构
栈内存讲的是虚拟机栈 对应局部变量表
局部变量表所需要的内存在编译时分配
int
long
double
float
boolean
char
short
byte
reference
栈可以放基础数据类型和引用数据类型
栈深度大于虚拟机允许的深度
条件
调整线程栈大小
越大线程总数越少
越少线程总数越大
-Xss
解决办法
stackoverflower
虚拟机动态扩展 扩展到无法申请足够内存
oom
虚拟机栈
执行虚拟机用到的native方法
本地方法栈是给虚拟机用的
虚拟机栈是给java程序用的
与虚拟机栈的区别
本地方法栈
线程共享内存区
虚拟机启动时创建
唯一作用是存放对象实例
可以处于逻辑上连续 物理上不连续的内存空间中
修改jvm启动时申请的heap值
默认物理内存的1/64
当空余堆内存大于70%时 会减小到设定值
-Xms
jvm可申请的最大内存
默认物理内存1/4小于1G
当空余堆内存小于40%时 会增大到设定值
-Xmx
新生代大小
默认堆的3/8
设置新生代内存堆总内存不变会减少老年代内存
持久代不变
s0
s1
两个survivor
eden
-Xmn
参数
可以固定大小 也可以用扩展
堆
线程共享
储存已被虚拟机加载的类信息 常量,静态变量,编译后的代码等
垃圾回收比较少见
方法区内存初始大小
-XX:PremSize
方法区的最大内存大小
-XX:MaxPremSize
方法区
是方法区的一部分
用与存放编译后各个字面量和符号引用
存放直接引用
运行时常量池
图
java内存区域
获取类的二进制字节流,将其精通存储结构转换为方法区的运行时数据结构
加载类
效验文件格式,元数据验证,字节码验证,符号引用验证
分配内存
在方法区中对类的static变量分配内存并设置类变量数据默认的初始值
不包括实例变量,实例变量会在对象实例化时候一起分配到java堆中
初始化数据
解析 将常量池内的符号引用替换成直接引用的过程
设置对象头
为类的静态变量赋予正确的初始值
执行init方法
java程序执行过程
复制删除法
标记删除法
标记整理法
方式
废弃的常量
无用的引用
所有实例都被回收
classload 已被回收
没有任何地方引用
无法通过反射访问
无用的类
gc的类
虚拟机栈中的引用对象
类变量
常量
本地方法栈中的对象引用
不gc的类
gcroot
gc
java.lang
home
ext
y应用程序加载器
jvm的三种加载类
jvm
初始化容量:hash表扩容时桶的数量
负载因子 hash表size/初始化容量
当负载因子到极限时候成倍增加桶的数量
扩容耗性能
扩容
hashmap
hashtable
concurrenthashmap
map
arraylist
linkedlist
Vector
java基础
请求锁线程队列
contentionList
有资格的候选队列
entryList
wait方法后阻塞队列
waitset
竞争候选者
onDeck
竞争到锁的线程
ower
执行成功后释放锁的状态
!ower
非公平锁
synchronized
基本定义
synchronized线程进入contentionlist中时会尝试自旋获取锁
获取不到就进入contentList里
抢占ondeck线程的资源
monitorenter 和monitorexit指令实现
每个对象有一个监视器锁
被占用时候处于锁定状态
线程执行monitorenter指令时超时获取monitor的所有权
内部定义同步的sync
能就true 不能就false
trylock()
中断线程会抛异常
lockInterruptibly()
能就true 不能就等一会 在不行就false
trylock(long time)
能锁就true 不能就一直等待
lock
避免死锁
reentrantlock
monitor为0时如果线程已占用monitor 设置计数器为1
线程已经占用monitor 从新进入monitor计数加1
其他线程进入monitor当前线程阻塞知道monitor为0
实现原理
reentrantlock是显示释放锁
synchronized是隐式锁
都是可重入锁
reentrantlock更灵活 可以定义读写 synchronized是jvm级别
synchronized是java中的关键字
reentrantlock是公平锁
synchronized 和reentrantlock的区别
同一个线程可以多次获取同一把锁,不会因为之前已经获取过还没释放而阻塞
可以一定程度避免死锁
可重入锁
基于aqs实现构造
并发工具包
acquire()
release()
二原信号
互斥锁
semaphore
对与可重入锁如果是0就执行 其他就阻塞
非0就判断当前线程是否是锁的持有线程是就status +1
释放锁时候-1
只有0时候其他线程才能获取当前锁
线程独占
semaphote
countdownlatch
readwritelock
cyclicbarrier
aqs
a=1; (a=1)?a=2:none
aba问题
如果cas失败 cpu会带来压力
只能保证一个操作的原子性
缺点
atomic
应用
cas
无锁
偏向第一个访问锁的线程
偏向锁
线程进行阻塞操作前先让宣传自旋等待一段时间
可能在等待时候内存已经解锁避免内核切换
自旋锁可能死锁
递归可能死锁
问题
底层是通过想线程栈中的lock record指针实现的
自旋锁
线程自旋超过10次
等待自旋的线程超过了系统核心数的一半
重量级锁
自旋锁通过cas来避免开销较大的互斥操作
偏向锁是在无竞争场景下完全消除同步,不执行自旋操作
自旋锁和偏向锁的区别
把高16记为读
低16记为写
基于aqs
读写锁
利用节点名称的唯一性来实现
加锁时所有节点一起创建 只有一个创建成功者获取锁
解锁时删除节点
方案1
利用邻居顺序节点实现
加锁时所有客户端创建临时顺序节点 节点最小的获取锁
其他监视临近节点等待
方案2
zk宕机后方案2会顺序释放锁 不会造成锁等待
方案1会产生集群效应
不如redis
zookeeper实现分布式锁
锁的四种状态
线程安先后顺序获取锁 先到先得
公平锁
线程获取锁的顺序随机
如果线程没进入队列等待则优先获取锁
如果线程进入等待队列就和公平锁一样
锁
通过注解将请求模板话
在实际调用中将参数直接用到请求上,进而产生真正的请求
http轻量级请求框架
基于自身特征封装http流程
采用jdk默认的HttpURLConnection性能不高
可以改成okhttp3客户端
特点
基于动态代理生成实现类
根据注解声明解析底层methodhandler
基于requestbean生成request
encode 将bean包装成请求
拦截器负责装饰处理
记录日志
根据重试器retryer发送请求
http请求报文发送到服务器
服务器返回http返回报文
decode 解码成实例response bean
调用过程
feignclient
基于netifx ribbon实现的客户端负载均衡工具
服务器注册到eureka上
EUReka返回所有服提供方的信息
feign中的ribbon通过负载均衡策略选择某一个服务器发
服务提供方.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
可以通过ribbon配置修改负载均衡策略
extends AbstractLoadBalancerRule类
自定义负载均衡
流程
ribbon
hystrix
spring boot
面试题
0 条评论
回复 删除
下一页