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