多线程学习大纲

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84768644

点击一级类目即可跳转对应的链接

1. 多线程基础概念 5

1.1. 进程,线程 5

1.1.1. 进程 5

1.1.2. 线程 5

1.2. 串行,并发,并行 6

1.2.1. 串行 6

1.2.2. 并发 6

1.2.3. 并行 6

1.3. 多核下线程数量选择 6

1.3.1. 计算密集型 6

1.3.2. IO密集型 6

1.4. 线程分类 6

1.4.1. 守护线程 6

1.4.2. 用户线程 6

2. 线程的实例化方式 7

2.1. Java线程有三种实例化方法 7

2.2. 继承Thread类 7

2.3. 实现Runnable接口 7

2.4. 实现Callable接口 7

3. 线程的常用方法 7

3.1. Object的相关方法 7

3.1.1. wait():线程进入等待状态 7

3.1.2. Notify(),notifyAll():唤醒同步锁上处于等待状态的线程 8

3.2. Thead的静态方法 8

3.2.1. sleep():使当前线程休眠,但不释放锁 8

3.2.2. yield():释放CPU执行权 8

3.2.3. currentThread():获得当前线程 8

3.3. Thead的非静态方法 8

T.interrupt():设置当前线程为可中断线程。可中断t.lockInterruptibly()方式加锁并且处于等待获取锁状态的线程。但对于运行中的线程不可中断。 9

3.3.8.1. T.interrupt()和T.isInterrupted()协作来中断线程 9

3.3.8.2. sleep,wait,join中的线程被设置为可中断线程时抛出异常 9

4. 线程的生命周期 9

4.1. New 初始化 9

4.2. Runnable 可运行 9

4.3. Running 运行中 9

4.4. Block 阻塞 9

4.4.1. 等待阻塞 9

4.4.2. 同步阻塞 9

4.4.3. 其他阻塞:sleep() , join() , 发出了I/O请求 10

4.5. Dead 消亡 10

4.6. 模型图1 10

4.7. 模型图2 10

4.8. 线程的控制 11

5. 并发编程的机制研究 11

5.1. 生活实例模型 11

5.2. 并发编程的通信机制 11

5.2.1. 读-写共享变量:while条件中的共享变量用于线程之间的通讯 12

5.2.2. 等待通知机制:通过wait() notify()机制唤醒对应的线程 12

5.3. 出现线程安全的原因: 12

5.3.1. 主内存和工作内存数据不一致:JMM模型导致的 12

5.3.2. 指令的重排序:编译器或处理器导致的 12

5.4. 线程安全的处理方案:CAS,volative,synchronized,lock 12

6. java内存模型(JMM):共享内存的并发模型 12

6.1. 模型结构:内存可见性 12

6.2. 问题 12

6.3. 处理方案 12

7. 编译器/处理器的重排序 12

7.1. 流程 12

7.2. 原则: 13

7.3. as-if-serial规则 13

7.4. happens-before规则 13

7.5. 重排序的规则 13

7.6. 内存屏障(Memory Barrier ) 13

8. DCL double-check locks(指令重排序导致的非线程安全问题) 14

8.1. 单例模式1: 非线程安全模式 14

8.2. 单例模式2:synchronized修改方法块 14

8.3. 单例模式3:DCL模式:检查-加锁-检查 14

8.4. 最终版:单例模式4:volatile变量禁止指令重排序,让DCL生效 14

8.5. 常用的单例模式:类初始化时完成实例化 15

9. Volatile-CAS-synchronized-lock对比 15

10. Synchronized:悲观锁,可重入锁 16

10.1. 特点:可重入的锁 16

10.2. 使用注意事项:区分锁对象(锁不同没有互斥作用) 16

10.3. 原理: 16

10.4. synchronized的happens-before关系:先加锁后释放锁 16

10.5. JMM中的内存可见性 16

10.6. Synchronized优化 17

11. volatile:synchronized的轻量级实现 17

11.1. 作用:保证数据的可见性,以及确保变量不会被重排序 17

11.2. 使用案例 17

11.2.1. 和Synchronized结合,用于对变量n读多写少的情况 17

11.2.2. 和CAS结合保证操作的原子性,如AtomicInteger 17

11.2.3. 修饰线程之间的共享变量 17

11.3. 注意事项:本身不具备线程安全的特性 18

12. CAS 18

12.1. 什么是CAS? 18

12.2. 逻辑说明 18

12.3. 多线程环境下的问题 18

12.4. 处理方案:加锁,volatile变量修饰 18

12.5. CAS的应用步骤 18

12.5.1. 获取Unsafe的实例 18

12.5.2. 初始化变量的偏移量 18

12.5.3. 变量由volatile关键字修饰 18

13. AtomicInteger中CAS-volatile的应用 19

13.1. 简介 19

13.2. 属性 19

13.3. 核心方法compareAndSet(int expect, int update) 19

13.4. Get/set/getAndIncrement等方法 19

14. Unsafe中CAS的应用 19

14.1. 实例化 19

14.2. compareAndSwapInt为例 19

14.3. demo 20

15. 线程等待通知机制总结 20

 

15.1. 概述 20

15.2. Object.wait()/notify() 21

15.2.1. 使用案例 21

15.2.2. 运行结果 21

15.2.3. 特点 21

15.2.4. 使用场景 22

15.3. LockSupport.park()/unpark() 22

15.3.1. 使用案例 22

15.3.2. 运行结果 22

15.3.3. 特点 22

15.3.4. 使用场景 22

15.4. lock.lock()/unlock()  condition.await()/asignal() 22

15.4.1. 使用案例 22

15.4.2. 运行结果 23

15.4.3. 特点 23

15.4.4. 使用场景 23

 

16. LockSupport源码分析 22

16.1. 属性方法总结 22

16.1.1. final long parkBlockerOffset 线程中parkBlocker属性的偏移量 22

16.1.2. 构造函数:私有,无法被实例化 23

16.1.3. unpark(t):调用unsafe的方法,唤醒线程t 23

16.1.4. park(Object blocker):阻塞当前线程到对象blocker 23

16.1.5. getBlocker/setBlocker: 设置线程的阻塞者对象 23

16.2. 对线程中断的响应性研究 23

16.2.1. 代码实现 23

16.2.2. 执行结果 23

17. Unsafe源码分析 24

17.1. park方法 24

17.2. unpark方法 24

18. Thread源码分析 24

18.1. volatile Object parkBlocker 属性 24

18.2. parkBlocker 使用案例: 24

19. 锁的分类 25

20. AOS 26

20.1. 锁持有者管理器AbstractOwnableSynchronizer 26

20.2. 作用:在独占模式下,用于设置当前同步对象的占用线程。 26

20.3. 为什么需要将AQS持有锁的线程的标识向上抽取 26

21. AQS:基于FIFO等待队列的阻塞锁 27

21.1. 用来做什么? 27

21.2. 如何实现的? 27

21.3. 设计思想 27

21.4. 类关系图 27

21.5. Jdk方法 27

21.5.1. volatile int state 相关:unsafe使用CAS协议实现 27

21.5.2. transient volatile Node head; 28

21.5.3. transient volatile Node tail; 28

21.5.4. 添加释放锁方法final 28

21.5.5. isHeldExclusively() 29

21.6. AQS.Node节点详解 29

21.7. 自定义锁源码实现 30

21.8. AQS中状态的变更 30

21.9. 头节点,尾节点设置,waitStatus的更新 30

21.10. AQS.acquire源码分析 30

21.11. AQS.release源码分析 31

21.12. AQS.acquire----AQS.release流程运转 32

22. 队列同步器与锁的区别联系 33

23. Semaphore 信号量 34

23.1. 使用场景 34

23.2. 方法: 34

23.3. 源码分析 34

23.3.1. 构造器new Semaphore(2, boolean fair); 34

23.3.2. acquire() 34

23.3.3. release() 34

23.4. Demo使用案例 34

1.1. 源码: 35

1.2. 运行结果 35

24. 常用的数据结构线程安全分析 35

24.1. ArrayList非线程安全研究 36

24.2. Vector 线程安全研究 36

24.3. HashMap  非线程安全研究 36

24.4. ConcurrentHashMap  线程安全研究 37

2. 数据问题 37

3. MESI 缓存一致性协议 38

4. 总线Lock 38

25. Synchronized-Lock的区别联系 38

25.1. 实现方式 38

25.2. 释放锁 39

25.3. 中断等待状态的线程 39

26. java.util.concurrent.locks包分析 39

26.1. 类关系图 39

26.2. Lock接口分析 39

26.2.1. 优点 39

26.2.2. 发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象 39

26.2.3. 方法 39

26.3. Condition接口分析 40

26.3.1. 特点 40

26.3.2. 方法 40

26.4. ReadWriteLock接口分析 40

26.4.1. 特点 40

26.4.2. 方法 40

26.5. ReentrantReadWriteLock案例分析 40

26.6. ReentrantLock 可重入的互斥锁 41

26.6.1. 构造方法 41

26.6.2. 使用案例:生产消费者模型 41

26.7. 常用方法 43

 

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84768644
今日推荐