拉勾网《32个Java面试必考点》学习笔记之五------并发与多线程

本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:txzw@live.cn.将会删除相关内容

知识点汇总

多线程

知识点详解


线程的状态转换

线程的状态转换

六个状态对应ThreadState的枚举

CAS与ABA问题

CAS:

N
Y
读取数据
操作数据
值是否改变
写回数据

ABA问题:

数据 T1 T2 T3 读取A 读取A 写入B 读取A 写入A 无法判断值是否发生修改 数据 T1 T2 T3

Synchronized实现原理

Synchronized实现原理
锁优化会将锁由轻量级升级为重量级

AQS与Lock

AQS与Lock

线程池

Executors.NewFixedThreadPool固定线程数,无界队列.适用于任务数量不均匀的场景,对内存压力不敏感,但系统负载敏感的场景.

Executors..newCachedThreadPool无限线程数,适用于要求低延迟的短期任务场景.

Executors.newSingleThreadPool单个线程的固定线程池,适用于保证异步执行顺序的场景.

Executors.newScheduledThreadPool适用于定期执行任务场景,支持固定频率和固定延迟.

Executors.newWorkStealingPool使用ForkJoinPool,多任务队列的固定并行度,适合任务执行时长不均匀的场景.

线程池参数介绍

线程池构造方法

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepaAliveTime,TimeUnit timeUnit,BlockQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExceptionHandler rejectedHandler) //ThreadPoolExecutor构造方法

corePoolSize核心线程数,也可理解为最小线程数
maximumPoolSize最大线程数
keepaAliveTime非核心线程非活跃存活时间长度
timeUnit存活时间单位,枚举等
workQueue阻塞队列,如ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等
threadFactory可定制线程,一般使用默认即可
rejectedHandler线程池满时拒绝策略,如Abort,Discard,CallerRuns,DiscardOldest

线程池任务执行流程

提交任务
>coreSize
队列已满?
>maxSize
rejectPolicy
创建线程
进入队列
创建线程
执行

JUC常用工具
JUC常用工具

考察点

  1. 理解线程的同步与互斥原理

     临界资源与临界区的概念
     重量级锁,轻量级锁,自旋锁,偏向锁,读写锁,重入锁的概念
    
  2. 掌握线程安全相关机制

     CAS,synchronized,lock同步方式的实现原理
     ThreadLocal是线程独享的局部变量,使用弱引用的ThreadLocalMap保存ThreadLocal变量
    
  3. 了解JUC工具的使用场景与实现原理

     ReentrantLock,ConcurrentHash,LongAdder的实现方式
    
  4. 熟悉线程池的原理,使用场景,常用配置

     慎用无界队列,可能会有OOM的风险
    
  5. 理解线程的同步与异步,阻塞与非阻塞

     同步异步:任务是否在同一个线程中执行
     阻塞非阻塞:异步执行任务时,线程是否会阻塞等待结果
    

加分项

  1. 结合相机项目经验或实际案例介绍原理

  2. 解决多线程问题的排查思路与经验

  3. 熟悉常用的线程分析工具与方法

     如Jstack
    
  4. 了解Java8对JUC的增强

     用LongAdder替换AtomicLong,更适合并发度高的场景
    
  5. 了解Reactive异步编程思想

真题汇总

  1. 如何实现生产者消费者模型?

     可利用锁,信号量,线程通信,阻塞队列等方法实现
    
  2. 如何理解线程的同步与异步,阻塞与非阻塞?

  3. 线程池处理任务的流程?

  4. wait与sleep有什么不同?

     wait是Object方法,sleep是Thread方法
     wait会释放锁,sleep不会
     wait要在同步块中使用,sleep在任何地方使用
     wait不需要捕获异常,sleep需要
    
  5. Synchronized与ReentrantLock有什么不同,各适用什么场景?

  6. 读写锁适用与什么场景,ReentrantReadWriteLock是如何实现的?

  7. 线程之间如何通信?

     wait/notify机制
     共享变量的synchronize&lock同步机制
    
  8. 保证线程安全的方法有哪些?

     CAS,synchronized,lock,ThreadLocal
    
  9. 如何尽可能提高多线程并发性能?

     减少临界区范围
     使用ThreadLocal
     减少线程切换
     使用读写锁或CopyOnWrite
    
  10. ThreadLocal用来解决什么问题,ThreadLocal是如何实现的?

    不是用来解决多线程共享变量问题,而是用来解决线程数据隔离问题
    
  11. 死锁的产生条件,如何分析线程是否有死锁?

  12. 在实际工作中遇到过什么样的并发问题,如何发现排查并解决的?

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值