并发
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
概述<br>
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<br>
4.公平锁?sync非公平,Lock可以通过参数指定<br>
5.精准唤醒,sync不能只能随机唤醒,而lock可以通过Condition实现精准唤醒<br>
锁
公平/非公平
什么是公平锁非公平锁?
区别?
可重入锁或递归锁
自旋锁
读写锁/共享/独占
ReentrantReadWriteLock
并发辅助类
CountDownLatch 计时器
详解<br>
demo
CyclicBarrier 栅栏
详解
demo
Semaphore 信号灯<br>
详解
demo
阻塞队列
使用
线程池
消息中间件<br>
1.使用synchronized,#wait #notifyAll实现
2.使用lock,ReentrantLock#Condition,实现精准唤醒
生产消费模式
线程池
概念:线程池主要是控制运行的数量,将待处理任务放到等待队列,然后在线程创建后启动这些任务,如果线程数据超过了最大数量,超出数量的任务则排队等待,等其它线程执行完毕,再从队列中取出任务来执行;<br>
优点:控制线程数,线程复用,管理线程<br>
创建方式
newFixedThreadPool<br>
newSingleThreadExecutor<br>
newCachedThreadPool
newScheduledThreadPool
newWorkStealingPool
七大核心参数
corePoolSize
线程池中的常驻核⼼线程数<br>
maximumPoolSize
线程池中能够容纳同时指向的最⼤线程数,此值必须⼤于等于1
keepAliveTime
多余的空闲线程的存活时间,当前池中线程数量超过corePoolSize时,当<br>空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下<br>corePoolSize个线程为⽌
unit<br>
keepAliveTime存活时间的单位
workQueue<br>
任务队列,存放已提交但尚未执⾏的任务
threadFactory
表示⽣成线程池中⼯作线程的线程⼯⼚,⽤于创建线程,⼀般默认的即可
handler
<div><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:PingFangSC-Regular;color:rgb(0,0,0);">拒绝策略</span><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:PingFangSC-Regular;color:rgb(51,51,51);">,表示当队列满了,并且⼯作线程⼤于等于线程池的最⼤线程数<br></span></div><div><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:PingFangSC-Regular;color:rgb(51,51,51);">(</span><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:OpenSans-Regular;color:rgb(51,51,51);">maximumPoolSize</span><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:PingFangSC-Regular;color:rgb(51,51,51);">)时,如何来拒绝请求执⾏的</span><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:OpenSans-Regular;color:rgb(51,51,51);">runnable</span><span style="mso-spacerun:'yes';font-size:10.4014pt;font-family:PingFangSC-Regular;color:rgb(51,51,51);">的策略</span></div>
拒绝策略
AbortPolicy<br>
默认的策略,直接抛出 RejectedExecutionException 异常,阻⽌系统正常运<br>⾏<br>
*CallerRunsPolicy
既不会抛出异常,也不会终⽌任务,⽽是将任务返回给调⽤者,从⽽降低新<br>任务的流量
DiscardOldestPolicy
抛弃队列中等待最久的任务,然后把当前任务加⼊队列中尝试再次提交任<br>务
*DiscardPolicy
该策略默默地丢弃⽆法处理的任务,不予任何处理也不抛出异常。如果允许任务<br>丢失,这是最好的⼀种策略
线程池实际使用
原因就是 FixedThreadPool 和 SingleThreadExecutor 底层都是<br>⽤ LinkedBlockingQueue 实现的,这个队列最⼤⻓度为 Integer.MAX_VALUE ,显然会导致OOM。所<br>以实际⽣产⼀般⾃⼰通过 ThreadPoolExecutor 的7个参数,⾃定义线程池
自定义线程池参数指定
对于CPU密集型任务,最⼤线程数是CPU线程数+1
对于IO密集型任务,尽量多配点,可以是CPU线程数*2,或者CPU线程数/(1-阻塞系数)
死锁定位
jps -l
jstack pid<br>
LockSupport
pack
unpack
AQS
原理
使用变量state表示同步状态<br>
提供一个CLH(FIFO)队列,实现线程间的竞争和等待<br>
内部使用CAS原子操作方法,保证原子性<br>
0 条评论
下一页