线程

61 阅读3分钟

1. synchrnoized和reentrantlock的底层实现及重入的底层原理

1synchrnoized
a)synchrnoized用的锁是存在java对象头里的
  JVM基于进入和退出Monitor对象来实现方法同步和代码块同步
b)方法同步的时候,常量池中多了ACC_SYNCHRONIZED标示符,
	方法调用是如果设置了该标识符,执行线程获取monitor对象,执行方法体,执行完后释放monitor
https://www.pianshen.com/article/7905914645/
重入原理: entry count (进入次数)
https://blog.csdn.net/a772304419/article/details/104226398  解释通俗
2reentrantlock
a)基于AQS https://zhuanlan.zhihu.com/p/406878361 
b)可重入性state(AQS中)

2. sync和lock的区别

1synchronized是关键字,是jvm层面的低层活都帮我们做了;而Lock是一个接口,是JDK层面的,有丰富的API
2synchronized会自动释放锁,而Lock必须手动释放锁
3synchronized是不可中断的,Lock可以中断也可以不中断
4)通过Lock可以知道线程有没有拿到锁,而synchronized不能
5synchronized能锁住方法和代码块,而Lock只能锁住代码块
6)Lock可以使用读锁提高多线程读效率(ReentrantReadWriteLock)
7synchronized是非公平锁,ReentrantLock可以控制是否是公平锁

3. synchronized特性保证

1)有序性:
as-if-serial
	不管怎么重排序,单线程程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义
	所以编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。
	但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序
	https://blog.csdn.net/byhook/article/details/87971081
happens-before
2)可见性:
内存强制刷新
同步块的可见性是由
“如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值”、
“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这两条规则获得的
3)原子性:
单一线程持有
4)可重入性:
计数器
https://zhuanlan.zhihu.com/p/141624304

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问题