多线程进阶=>高并发JUC学习笔记

多线程进阶=>高并发JUC学习笔记

一、什么是JUC?

在这里插入图片描述
在这里插入图片描述

二、线程与进程

①基础

在这里插入图片描述

②线程状态State

在这里插入图片描述
在这里插入图片描述

③并发与并行

在这里插入图片描述
并发编程本质:充分利用CPU资源

④wait与sleep区别

在这里插入图片描述

三、Lock锁

①传统Synchronized方法

在这里插入图片描述
在这里插入图片描述

②Lock锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

③Synchronized与Lock的区别

在这里插入图片描述

④各种锁

1.(非)公平锁

公平锁:非常公平,不能够插队,必须先来后到!
非公平锁:非常不公平,可以插队[默认是非公平锁]
在这里插入图片描述

2.可重入锁(递归锁)

在这里插入图片描述

(1)Synchronized版本

在这里插入图片描述
在这里插入图片描述

(2)Lock版

在这里插入图片描述
在这里插入图片描述

3.死锁

就不做过多介绍,这里截图在多线程的例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.自旋锁[自定义锁]

在这里插入图片描述
在这里插入图片描述
运行结果:
B进程必须等待A进程Unlock后,才能Unlock,在这之前进行自旋等待。。。。

5.死锁排查

在这里插入图片描述
在这里插入图片描述
面试,工作中! 排查问题:
1、日志 9 成
2、堆栈 1成

四、生产者和消费者问题

1.Synchronized版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.Lock版

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后如何做到准确通知和唤醒?而不是随机=>
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、8锁现象【8个锁的问题】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、集合类不安全

在这里插入图片描述

1.List不安全

在这里插入图片描述

①Vector底层是使用synchronized关键字来实现的:效率特别低下。

在这里插入图片描述

②Collections.synchronizedList是利用给所有的方法加了锁 转换集合[方案二] 不过太简单粗暴,降低并发量

在这里插入图片描述

③CopyOnWriteArrayList()写时不复制,写时再去复制【底层用了violidate和transient】

在这里插入图片描述

2.Set不安全

在这里插入图片描述
new HashSet底层原理,实际上是HashMap
在这里插入图片描述
例子
在这里插入图片描述

3.Map不安全

在这里插入图片描述
new HashMap底层
在这里插入图片描述
例子
在这里插入图片描述
解决方案
在这里插入图片描述
在这里插入图片描述

4.阻塞队列下一章会讲解使用

七、阻塞队列

1.概念定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.为何要使用?

在这里插入图片描述

3.如何学会使用队列

操作是添加、删除
实际要学的是一下四组API
在这里插入图片描述

①添加:add 移除:remove =>抛出异常

在这里插入图片描述

②添加:offer 移除:poll =>无返回值,不跑出异常

在这里插入图片描述

③添加:put 移除:take =>等待

在这里插入图片描述

④添加:offer 移除:poll =>超时等待

在这里插入图片描述

4.SynchronizedQueue同步队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、Callable

在这里插入图片描述
在这里插入图片描述

1.源码分析

①首先Thread

在这里插入图片描述
看出 只能传入Runnalbe的参数

②看看Runnable的实现类FutureTask

在这里插入图片描述
这样我们就可以先把Callable 放入到FutureTask中, 如何再把FutureTask 放入到Thread就可以

2.代码

在这里插入图片描述

九、常用辅助类

①CountDownLatch 减法计数器

在这里插入图片描述
在这里插入图片描述

②CyclickBarrier 加法计数器

在这里插入图片描述
在这里插入图片描述

③Semaphone 信号量

抢车位:3个停车位 6个车
在这里插入图片描述
在这里插入图片描述

十、读写锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十一、线程池

线程池:三大方法、7大参数、4种拒绝策略

1.池化技术概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.三大方法

①方法源码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

②代码

在这里插入图片描述
在这里插入图片描述

3.七种参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:
在这里插入图片描述

4.四种拒绝策略

在这里插入图片描述
在这里插入图片描述

5.设置池的大小

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十二、四大函数式接口

在这里插入图片描述

①Function 函数式接口

在这里插入图片描述
在这里插入图片描述

②Consumer 消费式接口

在这里插入图片描述
在这里插入图片描述

③Predicate 断定型接口

在这里插入图片描述
在这里插入图片描述

④Supplier 供给型接口

在这里插入图片描述
在这里插入图片描述

十三、Stream流式计算

大数据:存储+计算
存储:集合|MySQL
计算:交给流来操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十四、ForkJoin

1.什么是ForkJoin?

在jdk1.7,并行执行任务!提高效率,大数据量!
大数据:Map Reduce(吧大任务拆分成小任务)
在这里插入图片描述

2.ForkJoin特点:工作窃取

实现原理是:双端队列!从上面和下面都可以去拿到任务进行执行!
在这里插入图片描述

3.如何使用ForkJoin

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.其他两种方式求和汇总

在这里插入图片描述

5.reduce方法

在这里插入图片描述

十五、异步回调

Future 设计的初衷:对将来的某个事件结果进行建模
其实就是前端 --> 发送ajax异步请求给后端,
但是我们平时都使用CompletableFuture
在这里插入图片描述
在这里插入图片描述
步骤:异步执行=>成功回调+失败回调

1.没有返回值的runAsync异步回调

在这里插入图片描述

2.有返回值的supply Async异步回调

在这里插入图片描述
在这里插入图片描述

十六、JMM【回顾多线程的课程即可】

在这里插入图片描述

十七、Volatile

Volatile 是 Java 虚拟机提供 轻量级的同步机制
1、保证可见性
2、不保证原子性
3、禁止指令重排

①保证可见性

在这里插入图片描述
在这里插入图片描述

②不保证原子性

原子性:不可分割;
线程A在执行任务的时候,不能被打扰的,也不能被分割的,要么同时成功,要么同时失败.
保证原子性:lock、synchhronized外 还有CAS
在这里插入图片描述
CAS:利用原子类
在这里插入图片描述
这些类的底层都直接和操作系统挂钩!是在内存中修改值。

③禁止指令重排

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十八、深入单例模式【只要是单例 构造器一定要私有化】

①饿汉式

在这里插入图片描述

DLC懒汉式

需要的时候再创建,节省空间。

问题1:只能用于单线程,无法使用多线程的问题

在这里插入图片描述
改进=>加锁
在这里插入图片描述

问题2:发现new对象 不是一个原子性操作,会造成指令重排的可能

改进=> 加volatile
在这里插入图片描述

问题3:反射会破坏上面单例模式

在这里插入图片描述
改进=>在构造器加吧锁
在这里插入图片描述

问提4:发现单例又反射被破坏了

不用上面写的getInstance(),而是全用构造器创建对象,发现单例又被破坏了
在这里插入图片描述
改进=>加一个标志:红绿灯
在这里插入图片描述

问提5:红绿灯标记被人知道了,单例模式被反射破解

发现红绿灯标志被知道了:不管怎么写,总有人会解密知道这个
在这里插入图片描述

③枚举类:

点进去看下源码
在这里插入图片描述

在这里插入图片描述
新建一个枚举类
在这里插入图片描述
可是这边target却有写空参构造法
在这里插入图片描述
探究:
在这里插入图片描述
所以
在这里插入图片描述
源码
在这里插入图片描述
所以确实反射不能破坏枚举类

④静态内部类

在这里插入图片描述

十九、深入理解CAS

1.什么是CAS?

在这里插入图片描述

2.unsafe

在这里插入图片描述

①点先这个U。

getAndInt留给②去点.
在这里插入图片描述

②点这个getAndInt

在这里插入图片描述
在这里插入图片描述
还采用了自旋锁[do whie]

3.总结

CAS:比较当前工作内存中的值 和 主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环,使用的是自旋锁。
缺点:
①循环会耗时;
②一次性只能保证一个共享变量的原子性;
③它会存在ABA问题

4.ABA

在这里插入图片描述
在这里插入图片描述

二十、原子引用

解决ABA问题,对应的思想:就是使用了乐观锁~
带版本号的 原子操作!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:取自bilibli狂神

知识点复习图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值