并发
2022-04-24 15:51:12 0 举报
AI智能生成
java基本并发类库,详解及java内存模型,cas,synchronized,volatile,线程等并发基础
作者其他创作
大纲/内容
Main Topic
内存模型
概述
内存模型
引入问题
volatile
概述
禁⽌指令重排优化底层实现
使用场景
CAS
底层原理
demo
AtomicInteger
底层实现
缺点
AtomicReference
AtomicStampedReference
集合类不安全问题
ArrayList
线程安全
如何变成线程安全
CopyOnWriteArrayList
底层实现
HashSet&HashMap
概述
HashMap&ConcurrentHashMap
概述
synchronized
底层原理
锁升级
为啥要锁升级
Lock
ReentrantLock
题:多线程情况下,按顺序执行,线程A 执行5 线程B 执行6次, 线程C 执行7次,循环10次
ReentrantLock&Synchronized
1.sync是jvm层面,通过monitorEnter和monitorexit实现,而ReentrantLock是api层面
2.sync自动释放,reentrantLock需要手动释放
3.是否可中断,sync不可中断,只有抛出异常或者运行结束,reentrantLock使用#interrupt
4.公平锁?sync非公平,Lock可以通过参数指定
5.精准唤醒,sync不能只能随机唤醒,而lock可以通过Condition实现精准唤醒
锁
公平/非公平
什么是公平锁非公平锁?
区别?
可重入锁或递归锁
自旋锁
读写锁/共享/独占
ReentrantReadWriteLock
并发辅助类
CountDownLatch 计时器
详解
demo
CyclicBarrier 栅栏
详解
demo
Semaphore 信号灯
详解
demo
阻塞队列
使用
线程池
消息中间件
1.使用synchronized,#wait #notifyAll实现
2.使用lock,ReentrantLock#Condition,实现精准唤醒
生产消费模式
线程池
概念:线程池主要是控制运行的数量,将待处理任务放到等待队列,然后在线程创建后启动这些任务,如果线程数据超过了最大数量,超出数量的任务则排队等待,等其它线程执行完毕,再从队列中取出任务来执行;
优点:控制线程数,线程复用,管理线程
创建方式
newFixedThreadPool
newSingleThreadExecutor
newCachedThreadPool
newScheduledThreadPool
newWorkStealingPool
七大核心参数
corePoolSize
线程池中的常驻核⼼线程数
maximumPoolSize
线程池中能够容纳同时指向的最⼤线程数,此值必须⼤于等于1
keepAliveTime
多余的空闲线程的存活时间,当前池中线程数量超过corePoolSize时,当
空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下
corePoolSize个线程为⽌
空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下
corePoolSize个线程为⽌
unit
keepAliveTime存活时间的单位
workQueue
任务队列,存放已提交但尚未执⾏的任务
threadFactory
表示⽣成线程池中⼯作线程的线程⼯⼚,⽤于创建线程,⼀般默认的即可
handler
拒绝策略,表示当队列满了,并且⼯作线程⼤于等于线程池的最⼤线程数
(maximumPoolSize)时,如何来拒绝请求执⾏的runnable的策略
拒绝策略
AbortPolicy
默认的策略,直接抛出 RejectedExecutionException 异常,阻⽌系统正常运
⾏
⾏
*CallerRunsPolicy
既不会抛出异常,也不会终⽌任务,⽽是将任务返回给调⽤者,从⽽降低新
任务的流量
任务的流量
DiscardOldestPolicy
抛弃队列中等待最久的任务,然后把当前任务加⼊队列中尝试再次提交任
务
务
*DiscardPolicy
该策略默默地丢弃⽆法处理的任务,不予任何处理也不抛出异常。如果允许任务
丢失,这是最好的⼀种策略
丢失,这是最好的⼀种策略
线程池实际使用
原因就是 FixedThreadPool 和 SingleThreadExecutor 底层都是
⽤ LinkedBlockingQueue 实现的,这个队列最⼤⻓度为 Integer.MAX_VALUE ,显然会导致OOM。所
以实际⽣产⼀般⾃⼰通过 ThreadPoolExecutor 的7个参数,⾃定义线程池
⽤ LinkedBlockingQueue 实现的,这个队列最⼤⻓度为 Integer.MAX_VALUE ,显然会导致OOM。所
以实际⽣产⼀般⾃⼰通过 ThreadPoolExecutor 的7个参数,⾃定义线程池
自定义线程池参数指定
对于CPU密集型任务,最⼤线程数是CPU线程数+1
对于IO密集型任务,尽量多配点,可以是CPU线程数*2,或者CPU线程数/(1-阻塞系数)
死锁定位
jps -l
jstack pid
LockSupport
pack
unpack
AQS
原理
使用变量state表示同步状态
提供一个CLH(FIFO)队列,实现线程间的竞争和等待
内部使用CAS原子操作方法,保证原子性
0 条评论
下一页