JUC多线程与并发
2022-03-27 20:23:38 51 举报
AI智能生成
登录查看完整内容
b站尚硅谷阳哥的视频
作者其他创作
大纲/内容
1.1保证可见性
1.2不保证原子性
1.3禁止指令重排
1.volatile是Java虚拟机体提供的轻量级的同步机制
2.1可见性
n++在多线程下是非线程安全的,如何不加synchronized解决?
2.2原子性
2.3volatileDemo代码演示可见性+原子性代码
重排1
重排2
禁止指令重排小结
2.4有序性
2.谈谈JMM(Java内存模型)
3.1单例模式DCL代码
3.2单例模式volatile分析
3.你在哪些地方用到过volatile?
1.请谈谈你对volatile的理解
CASDemo代码
1.比较并交换(Conmpare And Swap)
atomicInteger.getAndIncrement();(自旋锁)
使用了Unsafe类
底层汇编
简单版小结
CAS是什么
2.CAS底层原理?如果知道,谈谈你对UnSafe的理解
循环时间长开销很大
只能保证一个共享变量的原子操作
引出ABA问题??
3.CAS缺点
2.CAS你知道吗?
ABA问题是怎么产生的?
原子引用
时间戳原子引用
3.谈谈原子类AtomicInteger的ABA问题?原子更新引用知道吗?
解决方案一
限制不可以用Vetor和collections工具类,解决方案二
以上方法对其他集合也有效
4.我们知道ArrayList是线程不安全的,请编写一个不安全的案例并给出解决方案。
是什么
两者区别
题外话
公平和非公平锁
是什么
ReentranLock/Synchronized就是一个典型的可重入锁
可重入锁最大的作用就是避免死锁
参考1
参考2
ReenterLockDemo
可重入锁(又名递归锁)
SpinLockDemo
自旋锁
ReadWriteLockDemo
独占锁(写锁)/共享锁(读锁)/互斥锁
5.公平锁/非公平锁/可重入锁/递归锁/自旋锁/谈谈你的理解?请手写一个自旋锁
让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒
CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。其他线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为零时,因调用await方法被阻塞的线程会被唤醒,继续执行。
Count DownLatchDemo
CountDownLatch
CyclicBarrier的字面意思是可循环使用的屏障。它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。
CyclicBarrierDemo
CyclicBarrier
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,用一个用于并发线程数的控制
SemaphoreDemo
Semaphore
6.CountDownLatch/CyclicBarrier/Semaphore使用过吗?
队列+阻塞队列
为什么要用?有什么好处?
BlockingQueue的核心方法
架构介绍
ArrayBlockingQueue:由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:由链表结构组成的有界(但大小默认为Integer.MAX_VALUE)阻塞队列
PinorityBlockingQueue:支持优先级排序的无界阻塞队列。
DelayQueue:使用优先级队列实现的延迟无界阻塞队列。
理论
SynchronousQueueDemo
SynchronousQueue不存储元素的阻塞队列,也就是单个元素的队列
LinkedTransferQueue:由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:由链表结构组成的双向阻塞队列。
种类分析
架构梳理+种类分析
ProdConsumer_TradtionDemo
传统版
ProdConsumer_BlockQueueDemo
阻塞队列版
生产者消费者模式
线程池
消息中间件
用在哪里?
Sychronized和lock有什么区别?用新的Lock有什么好处?举例说说
7.阻塞队列知道吗
架构说明
Executors.newScheduledThreadPool()
java8新增,使用目前机器上可用的处理器作为它的并行级别
JDK1.8 Executors.newScheduledThreadPool(int)
了解
执行长期的任务,性能好很多
Executors.newFixedThreadPool(integer);
一个任务一个任务执行的场景
Executors.newSingleThreadExecutor();
适用:执行很多短期异步的小程序或者负载比较轻的服务器
Executors.newCachedThreadPool()
重点!(底层是什么)
ThreadPoolExecutor
编码实现
线程池如何使用?
线程池中的常驻核心线程数
int corePoolSize
int maximumPoolSize
long keepAliveTime
keepAliveTime的单位
TimeUnit unit
BlockingQueue<Runnable> workQueue
ThreadFactory threadFactory
RejectedExecutionHandler handler
7大参数
线程池的几个重要参数介绍?
说说下线程池的底层工作原理?
8.线程池用过吗?ThreadPoolExecutor谈谈你的理解
是什么?
AbortPolicyl(默认):直接抛出 Rejected Execution Exception异常阻止系统正常运行。
CallerRunsPolicy:\"调用者运行\
JDK内置的拒绝策略
以上内置拒绝策略均实现了RejectedExecutionHandler接口
线程池的拒绝策略你谈谈
答案是一个都不用,我们生产上只能使用自定义的
Executors中JDK已经给你提供了,为什么不用?
按照Executors中的照猫画虎就好了,就是最大线程数不要用Integer.MaxValue
case
CPU密集型
1
2
IO密集型
合理配置线程池你是如何考虑的?
9.线程池用过吗?生产上你如何设置合理参数?
系统资源不足
进程运行推进的顺序不合适
资源分配不当
产生死锁主要原因
代码
JPS命令定位进程号
JSTACK找到死锁查看
解决
10.死锁编码以及定位分析
11.Java里面的锁请谈谈你的理解,能说多少是多少。
来自b站尚硅谷阳哥的视频
JUC多线程以及高并发
0 条评论
回复 删除
下一页