目录
7、Synchronized和ReentrantLock异同点
1、并发三大特性:原子性、可见性、有序性
2、线程的生命周期:
创建、就绪、运行、阻塞、消亡
阻塞的三种状态:
等待阻塞:wait()方法、notify()或notifyAll()方法
同步阻塞:在请求同步锁时被阻塞
其他阻塞:线程执行sleep()方法或join()方法
3、锁池和等待池
锁池:所有竞争同步锁的线程都会放在锁池中
等待池:调用wait()方法后将其放入等待池,在该池中的线程不会去竞争同步锁
4、什么是线程安全?如何实现线程安全?
线程安全概念:当多个线程访问一个对象时,无论是调度还是交替执行,也不需要协调操作和同步,都能获得正确的结果
线程安全方法:
·互斥同步:线程互斥同步访问共享数据
·非阻塞同步:乐观并发策略,如CAS
·无同步方案:使用线程本地变量ThreadLocal
5、ReentrantLock实现
reentrantLock是基于AQS实现的,它是一个内部实现两个队列的抽象类,分别是同步队列和条件队列。(AQS是抽象队列同步器,主要使用的方法是继承)
通过lock和unlock方法加锁和释放锁
6、公平锁和非公平锁区别
两者之间最主要的区别再有请求锁时是先进入队列排队还是先申请锁
7、Synchronized和ReentrantLock异同点
相同点:
·都是可重入锁
·都保证了可见性和互斥性
·都可用于多线程共享对象的访问
不同点:
·底层:Synchronized是基于JVM级别的锁,而ReentrantLock是JDK实现的锁
·释放方式:Synchronized不需要手动释放,ReentrantLock需要用户手动释放
·是否可中断:Synchronized不可中断,ReentrantLock是可中断的
·是否是公平锁:Synchronized是非公平锁,ReentrantLock既可以是非公平锁也可以是公平锁
·锁的对象Synchronized锁的是对象,ReentrantLock锁的是线程
8、Synchronized锁升级过程
偏向锁:不存在锁竞争、常常是一个线程获取同一个锁
轻量级锁:竞争锁的对象不多,线程持有锁的时间也不长
重量级锁:竞争对象多,且持有锁对象时间长时
升级过程:偏向锁->轻量级锁->重量级锁
9、java中的并发关键字
常见的并发关键字:CountDownLatch、CylicBarrier、Semaphore和volatile
10、共享式锁
独占式锁:同一时刻独占式只能有一个线程获取同步状态
共享式锁:在同一时刻可以有多个线程获取同步状态
11、悲观锁和乐观锁
悲观锁:每次访问都会加锁
乐观锁:不会锁定资源,最常见的实现就是CAS
12、线程池
1、线程池优点
·降低资源消耗
·提高响应速度
·提高线程的可管理性
2、线程执行流程
首先判断线程池中的线程数是否大于设置的核心线程数,如果小于则创建核心线程;大于核心线程数则判断阻塞队列是否满,未满则入队,已满则判断线程是否已打线程最大线程数,小于则创建线程,大于则执行相应的拒绝策略。注:核心线程在执行完毕后会回收,普通线程在执行完后则回收。
3、线程池的7大核心参数
·corePoolSize:核心线程数定义了最小可以同时运行的线程数量
·maximumPoolSize:存放任务达到队列容量的时候,可以同时运行线程数量变为最大线程数
·keepAliveTime:核心线程活动保存时间
·TimeUnit:线程活动保持时间的单位
·runnableTaskQueue:用于保存等待执行的任务的阻塞队列
·threadFactory:用于创建线程池中工作线程的线程工厂
·rejectedExecutionHandler:饱和策略
4、线程池的类型和适用场景
newCachedThreadPool:线程池大小不固定,可灵活回收空闲进程,适用于并发执行大量短期的小任务
newFixedThreadPool:固定大小的线程池,适用于处理CPU密集型任务
newScheduledThreadPool:定时线程池,支持定时周期性任务执行
newSingleThreadExecutor:只创建一个线程,适用于串行任务的执行
5、线程池的四种拒绝策略
AboutPolicy(默认):丢弃任务并抛出RejectedExecutionExeception异常
DiscardPolicy:丢弃任务,不抛出异常
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒接的任务
CallerRunsPolicy:由调用线程处理该任务,
6、常见的阻塞队列
ArrayBlockingQueue:基于常量数组实现,需要指定初始化大小,插入和删除是同一把锁
LinkedBlockingQueue:基于链表实现,可能造成OOM问题,插入和删除使用不同的锁,并发处理效率高
SynchronousQueue:不存储任何元素的阻塞队列,每一个put操作必须等待take操作,支持公平锁和非公平锁
PriorityBlockingQueue:支持优先级排序的无界阻塞队列,可自定义比较方法来指定排序规则,注意可能抛出ClassCastException异常
DelayQueue:是一个实现 PriorityBlockingQueue的延迟获取的无界队列,具有延迟功能
13、ThreadLocal
ThreadLocal主要解决的就是让每个线程都有自己的值,是java所提供的线程本地存储机制
适用场景:
·可用于跨层次对象的数据传递
·线程间的数据隔离
·进行事务操作,用于存储线程的事务信息
·数据库连接、session会话
ThreadLocal可能导致的问题:Thread有一个ThreadLocalMap的内部属性,map的key是ThreadLocal,为弱引用,value为强引用,每次gc会回收key,而value保留,可能会出现OOM,所以在每次使用ThreadLocal后,使用remove()方法手动删除,避免内存泄漏。
14、强、软、弱、虚引用
强引用:只要对象没有被显式的赋值为null,则强引用永远不会被回收被引用的对象
软引用:描述非必需仍有用的对象,内存足够时不会被回收,内存不足时会被回收,常用来实现缓存技术
弱引用:无论内存是否足够,都会被回收
虚引用:随时会被回收
15、守护线程作用
为所有非守护线程提供服务得线程,GC垃圾回收线程就是经典的守护线程,守护线程不能用于访问固有资源。