集合与并发编程
用例图和功能树
用例图关注有哪些角色,角色能干什么。
功能树关注有哪些大的功能模块,功能模块能够实现什么能力。
先有用例图,再有功能树
用例图对需求分析的再次结构化,功能树是对用例图的重新聚合
比如:系统管理员和乘客在实名认证上的管理与申请实名都是从属实名认证模块。
T31用例图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBbbfelH-1637148050103)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113162450052.png)]
用例图关注有哪些角色? 乘客、车站运营、系统管理员
角色能干什么? 从用户意识出发、用户视角、带入用户场景
T31 功能树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjpeiZjK-1637148050107)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113162643213.png)]
T31部署图
关注部署元素
微服务、数据库
关注部署关联元素
注册中心、消息中间件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRrdMDdN-1637148050109)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113162724702.png)]
Java集合框架图
接口、抽象类、并发包中的类、早期线程安全的类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ii7qhOE-1637148050112)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113162859006.png)]
数据结构和时间复杂度
数据结构:指逻辑意义上的数据组织方式及其相应的处理方式(Basic CRUD)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vewQplj2-1637148050113)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113163032696.png)]
对数级收敛速度相当的快
HashMap的基本概念
哈希类集合的三个基本存储概念
名称 | 说明 |
---|---|
table | 存储所有节点数据的数组 |
slot | 哈希槽。即 table[i] 这个位置 |
bucket | 哈希桶。table[i] 上所有元素形成的表或数的集合 |
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含Node内部类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZsT3f7SN-1637148050115)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113165128645.png)]
并发和并行
并行是指同时处理多任务的能力
并发是指在某个时间段内,多任务交替处理的能力
一个房间里有两个医生 并行 不同CPU同一时刻执行不同的方法
一个医生有多个病人 并发 同一CPU不同时刻交替执行不同的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIWkv5Ij-1637148050117)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113165955468.png)]
线程安全
- 以医生坐诊为例,医生并发地处理多份病人的询问、开化验单、查看化验结果、开药等工作,任何一个环节一旦出现数据混淆,都有可能引发严重的医疗事故
- 线程不安全就是交替执行,没有加锁,数据容易串起来
- 延伸到计算机的线程处理过程中,因为各个线程轮流占用CPU的计算资源,可能会出现某个线程尚未执行完就不得不中断的情况,容易导致线程不安全
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTlAgWzI-1637148050119)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113170249267.png)]
线程安全问题旨在多线程环境下才出现,单线程串行执行不存在此问题。
保证高并发场景下的线程安全,可以从以下四个维度考量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFRtIoN2-1637148050120)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113170425822.png)]
什么是锁
起初锁的概念
在计算机信息世界里,单机单线程时代没有锁的概念。
资源竞争的出现
自从出现了资源竞争,人们才意识到需要对部分场景的执行加锁,昭告天下,表明自己的“短暂”拥有
Java中常用锁的实现方式
- 用并发包中的锁类
- 利用同步代码块
jstack介绍
java命令–jstack 工具 - milkty - 博客园 (cnblogs.com)
jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:
jstack [-l] pid
主要分为两个功能:
a. 针对活着的进程做本地的或远程的线程dump;
b. 针对core文件做线程dump。
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
So,jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
线程状态
想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
NEW,未启动的。不会出现在Dump中。
**RUNNABLE,**在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
**TIMED_WATING,**有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
TERMINATED,已退出的。
Monitor
在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。下 面这个图,描述了线程和 Monitor之间关系,以 及线程的状态转换图:
AQS
AQS透过现象看本质
- Abstract抽象:包含tryAcquire、tryRelease等5个抽象方法,具体由子类实现;
- Queued队列:利用队列来管理竞争共享资源的多线程,这个队列是Node节点的引用虚拟实现;
- Synchronizer同步器:是一个解决多线程同步问题的工具
AQS的本质:解决多线程访问共享资源并发问题的同步管理框架
AQS同步器
资源管理:
获取资源
根据资源的同步状态,有则取锁,无则入队等待
释放资源
修改资源的同步状态,并唤醒等待线程
支持多种同步机制
- 支持独占和共享锁两种资源获取方式;
- 线程阻塞后,支持取消中断;
- 线程阻塞后,支持超时中断
Lock、AQS与AOS的关系
Loack实现类的内部类继承AQS,AQS继承AOS(简称AOS)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RR95QEm8-1637148050121)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113171402124.png)]
AQS的使用场景
-
线程同步类:
Semaphore、ReentrantReadWitrLock、ReentrantLock、CountDownLatch、CyclicBarrier
-
线程池:
ThreadPoolExcutor、 ScheduledThreadPoolExcecutor
-
线程安全Queue/List/Map:
ConcurrentHashMap、LinkedBlockingQueue、CopyOnWriteArrayList
AQS为Java并发同步组件提供统一的底层支持,支持有目的、有步骤、有计划的协同作业
AQS同步队列
AQS通过CLH机制来管理Node节点的先来后到,其中依据Node对象的next、prev串起来的一个双向的同步队列
线程和线程池
线程可以拥有自己的操作栈、程序计数器、局部变量表等资源,它与同一进程内的其他线程共享该进程的所有资源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCLeHBD8-1637148050122)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113172120138.png)]
线程的运行状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hi8Pf0cD-1637148050123)(C:\Users\Zyf\Desktop\T31作业\Day17 系统功能规划文档集合并发编程笔记\新建文本文档.assets\image-20211113172315394.png)]
线程池的作用
-
利用线程池管理并复用线程、控制最大并发数等
-
增加对线程的管理,快速排查问题
-
实现任务线程队列缓存策略和拒绝机制
-
实现某些与时间相关的功能,如定时执行、周期执行等
-
隔离线程环境
资源。
[外链图片转存中…(img-lCLeHBD8-1637148050122)]
线程的运行状态
[外链图片转存中…(img-Hi8Pf0cD-1637148050123)]
线程池的作用
-
利用线程池管理并复用线程、控制最大并发数等
-
增加对线程的管理,快速排查问题
-
实现任务线程队列缓存策略和拒绝机制
-
实现某些与时间相关的功能,如定时执行、周期执行等
-
隔离线程环境
比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;因此,通过配置独立的线程池,将较慢的交易服务与搜素服务隔离开,避免各服务线程相互影响。