没有合适的资源?快使用搜索试试~ 我知道了~
来自B站 遇见狂神说
资源详情
资源评论
资源推荐
JUC并发编程
进阶版
2019-05-31
来源:遇见狂神说
目录
1、什么是JUC ...................................................... 3
2、进程和线程回顾 .................................................. 3
3
、
Lock
锁
........................................................ 6
4、生产者和消费者 .................................................. 9
5
、
8
锁的现象 ..................................................... 17
6
、集合类不安全 ................................................... 26
7
、
Callable
....................................................... 30
8、常用辅助类 .....................................................32
8.1
、
CountDownLatch
........................................... 32
8.2
、
CyclicBarrier
.............................................. 33
8.3
、
Semaphore
................................................ 33
9
、读写锁 ........................................................ 34
10、阻塞队列 ..................................................... 37
11
、线程池 ....................................................... 42
12
、四大函数式接口 ................................................ 48
13
、
Stream
流式计算
................................................ 50
14、分支合并 ..................................................... 53
15、异步回调 ..................................................... 57
16
、
JMM
........................................................ 59
17
、
volatile
.......................................................62
18
、深入单例模式 .................................................. 66
1
、饿汉式 .....................................................66
2
、懒汉式 .....................................................67
3
、静态内部类 ................................................. 69
4、万恶的反射 ................................................. 69
5、枚举 ...................................................... 71
19、深入理解CAS .................................................. 73
20、原子引用 ..................................................... 76
21
、
Java
锁
....................................................... 80
1
、公平锁非公平锁 .............................................. 80
2
、可重入锁 ................................................... 81
3
、自旋锁 .....................................................83
4
、死锁 ...................................................... 84
进程
/
线程是什么?
1、什么是JUC
java.util.concurrent
包是在并发编程中使用的工具类,有以下三个包:
2、进程和线程回顾
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行
的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意
义,线程可以利用进程所有拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基
本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程小,基本上不拥有系统资源,
故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
白话:
进程:就是操作系统中运行的一个程序,
QQ.exe, music.exe
,
word.exe
,这就是多个进程
并发
/
并行是什么?
线程的状态
1
2
3
4
5
6
7
8
9
10
11
public enum State {
//线程刚创建
NEW,
//
在
JVM
中正在运行的线程
RUNNABLE,
//线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
BLOCKED,
//
等待状态
线程:每个进程中都存在一个或者多个线程,比如用word写文章时,就会有一个线程默默帮你定时自动
保
存。
学习一些枯燥的概念的时候,一定要与生活中的例子结合起来,这样记忆才是最方便的。
做并发编程之前,必须首先理解什么是并发,什么是并行。
并发和并行是两个非常容易混淆的概念。它们都可以表示两个或多个任务一起执行,但是偏重点有点不
同。并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。并发是逻辑上的同时发生
(
simultaneous
),而并行是物理上的同时发生。然而并行的偏重点在于
”
同时执行
”
。
严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,这个过程只是交替的,一会运
行任务一,一会儿又运行任务二,系统会不停地在两者间切换。但对于外部观察者来说,即使多个任务是
串行并发的,也会造成是多个任务并行执行的错觉。
实际上,如果系统内只有一个CPU,而现在而使用多线程或者多线程任务,那么真实环境中这些任务不
可能真实并行的,毕竟一个CPU一次只能执行一条指令,这种情况下多线程或者多线程任务就是并发
的,而不是并行,操作系统会不停的切换任务。真正的并发也只能够出现在拥有多个CPU的系统中(多
核
CPU
)。
并发的动机:在计算能力恒定的情况下处理更多的任务, 就像我们的大脑, 计算能力相对恒定, 要在一天中处
理更多的问题, 我们就必须具备多任务的能力. 现实工作中有很多事情可能会中断你的当前任务, 处理这
种
多任务的能力就是你的并发能力。
并行的动机:用更多的CPU核心更快的完成任务. 就像一个团队, 一个脑袋不够用了, 一个团队来一起处理
一个任务。
例子:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是
同时的)
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
Java
的线程有
6
种状态:可以分析源码:
wait / sleep
的区别
12
WAITING,
13
14
//
调用
sleep() join() wait()
方法可能导致线程处于等待状态
15
TIMED_WAITING,
16
17
//
线程执行完毕,已经退出
18
TERMINATED;
19
}
1
、来自不同的类
这两个方法来自不同的类分别是,
sleep
来自
Thread
类,和
wait
来自
Object
类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a
去睡觉,要让
b
线程睡觉要在
b
的代码中调用
sleep
。
2
、有没有释放锁
(
释放资源
)
最主要是
sleep
方法没有释放锁,而
wait
方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系
统
资源,
wait
是进入等待池等待,让出系统资源,其他线程可以占用
cpu
。
sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池 中等
待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同 的是其
他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待 系统分配
资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调
用分配资源,
所以
wait100
的停止运行时间是不确定的,但至少是
100
毫秒。
剩余86页未读,继续阅读
cc雨小果
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0