1. synchrnoized和reentrantlock的底层实现及重入的底层原理
1)synchrnoized
a)synchrnoized用的锁是存在java对象头里的
JVM基于进入和退出Monitor对象来实现方法同步和代码块同步
b)方法同步的时候,常量池中多了ACC_SYNCHRONIZED标示符,
方法调用是如果设置了该标识符,执行线程获取monitor对象,执行方法体,执行完后释放monitor
https:
重入原理: entry count (进入次数)
https:
2)reentrantlock
a)基于AQS https:
b)可重入性state(AQS中)
2. sync和lock的区别
1)synchronized是关键字,是jvm层面的低层活都帮我们做了;而Lock是一个接口,是JDK层面的,有丰富的API
2)synchronized会自动释放锁,而Lock必须手动释放锁
3)synchronized是不可中断的,Lock可以中断也可以不中断
4)通过Lock可以知道线程有没有拿到锁,而synchronized不能
5)synchronized能锁住方法和代码块,而Lock只能锁住代码块
6)Lock可以使用读锁提高多线程读效率(ReentrantReadWriteLock)
7)synchronized是非公平锁,ReentrantLock可以控制是否是公平锁
3. synchronized特性保证
1)有序性:
as-if-serial
不管怎么重排序,单线程程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义
所以编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。
但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序
https:
happens-before
2)可见性:
内存强制刷新
同步块的可见性是由
“如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值”、
“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这两条规则获得的
3)原子性:
单一线程持有
4)可重入性:
计数器
https:
4. 锁的四种状态及升级过程
无锁 偏向锁 轻量级锁 重量级锁
JVM中对象在内存中分为三块区域:对象头 实例数据 数据填充
5. 线程池了解多少
线程池中核心类:ThreadPoolExecutor
corePoolSize:核心线程数
maximumPoolSize:线程池允许创建的最大线程数
keepAliveTime:空闲线程等待超时的时间
unit:参数keepAliveTime的时间单位
workQueue: 任务队列,用于保存等待执行任务的阻塞队列
threadFactory:线程工厂,主要用于创建线程
handler:饱和策略
corePoolSize,maximumPoolSize,workQueue之间关系。https://www.cnblogs.com/linguanh/p/8000063.html
当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。
5. 线程池拒绝策略分别使用在什么场景
CallerRunsPolicy(调用者运行策略)
AbortPolicy(中止策略)
DiscardPolicy(丢弃策略)
DiscardOldestPolicy(弃老策略)
https://cloud.tencent.com/developer/article/1520860
6. 线程池的设计里体现了什么设计模式
享元模式
7. 除了CAS,原子类,syn,Lock还有什么线程安全的方式
final
8. CAS的ABA问题怎么解决
AtomicStampedReference类的cas方法实现了版本号机制,可用它来解决ABA问题