高并发学习笔记
文章平均质量分 75
线程 线程池 可视化线程
过期小朋友、
积极主动(找到关注的目标,关注那些力所能及且可以掌控的事情)、以终为始、要事第一
展开
-
自定义线程池
我这两天看完了“无暴雨”老师讲的自己写一个线程池,以理解juc包里的线程池部分。自己跟着写了一个简单的线程池。先来整理一下思路。附上代码和运行结果作证。最后将很巧妙的地方整理。1.线程池原理堆里的一个线程池对象,含有已经创建好的线程对象。当外部调用线程池对象提交任务的方法,线程池会将任务放到一个阻塞队列维护。当外部提交的任务超出队列元素上限,执行拒绝策略。拒绝策略有放弃这个任务、将拒绝策略异常抛出给执行提交任务的线程、提交任务的去执行任务。当线程任务队列中有任务,线程池中的线程会执行任务。运行一段时间原创 2021-03-02 22:09:44 · 247 阅读 · 0 评论 -
多线程设计模式——二十三、Two Phase Termination 设计模式
1、什么是 Two Phase Termination 模式当一个线程正常结束,或者因被打断而结束,或者因出现异常而结束时,我们需要考虑 如何同时释放线程中资源,比如文件句柄、 Socket 套接字句柄、数据库连接等比较稀缺的 资源。 Two Phase Termination 设计模式可以帮助我们实现,如图所示如图所示,我们使用“作业中”表示线程的执行状态,当希望结束这个线程时,发出线 程结束请求,接下来线程不会立即结束,而是会执行相应的资源释放动作直到真正的结束, 在终止处理状态时,线程虽然还在运原创 2021-02-28 12:18:06 · 279 阅读 · 4 评论 -
多线程设计模式——二十、Balking 设计模式
1、什么是 Balking 设计多个线程监控某个共享变量,A 线程监控到共享变量发生变化后即将触发某个动作,但 是此时发现有另外一个线程 B 已经针对该变量的变化开始了行动,因此 A 便放弃了准备 开始的工作,我们把这样的线程间交互称为 Balking(犹豫)设计模式。其实这样的场景 在生活中很常见,比如你去饭店吃饭,吃到途中想要再点一个小菜,于是你举起手示意服务 员,其中一个服务员看到了你举手正准备走过来的时候,发现距离你比较近的服务员已经准 备要受理你的请求于是中途放弃了。再比如,我们在用 word原创 2021-02-26 15:30:04 · 200 阅读 · 0 评论 -
多线程设计模式——二十一、Guard Suspension设计模式
1、什么是 Guarded Suspension 设计模式Suspension 是“挂起”、“暂停”的意思,而 Guarded 则是“担保”的意思,连在一起 就是确保挂起。当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时 再次访问。Guarded Suspension 设计模式是很多设计模式的基础,比如生产者消费者模式,同 样在 Java 并发包中的 BlockingQueue 中也大量使用到了 Guarded Suspension 设计模 式。2、Guarded Suspension原创 2021-02-26 15:21:53 · 182 阅读 · 0 评论 -
多线程设计模式——二十二、Latch设计模式
Latch(阀门)设计模式也叫做 Count Down 设计模式。当若干个线程并发执行完某个特 定的任务,然后等到所有的子任务都执行结束之后再统一汇总。CountDownLatch 能够使一个线程在等待另外一些线程完成各自工作之后,再继续执 行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后, 计数器的值就会减一。当计数器的值为 0 时,表示所有的线程都已经完成了任务,然后在 CountDownLatch 上等待的线程就可以恢复执行任务。示例代码如下:代码1:封装自己的Co原创 2021-02-26 15:16:58 · 323 阅读 · 0 评论 -
多线程设计模式——十九、上下文设计模式
关于上下文(Context),我们在开发的过程中经常会遇到,比如开发 Struts2 的 ActionContext、 Spring 中的 ApplicationContext,上下文是贯穿整个系统或阶段生 命周期的对象,其中包含了系统全局的一些信息,比如登录之后的用户信息、账号信息,以 及在程序每一个阶段运行时的数据。具体的代码业务逻辑图:代码1:Context:共享资源package com.bjsxt.chapter19.demo01;/** * @author wmr * @dat原创 2021-02-25 17:50:30 · 456 阅读 · 3 评论 -
多线程设计模式——十八、Immutable 不可变对象设计模式
不可变对象一定是线程安全的。18.1、关于时间日期 API 线程不安全的问题想必大家对 SimpleDateFormat 并不陌生。SimpleDateFormat 是 Java 中一个非常 常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微 妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的, 在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。关于时 间日期 API 的线程不安全原创 2021-02-25 17:38:43 · 100 阅读 · 0 评论 -
多线程设计模式——十七、生产者消费者设计模式
生产者和消费者也是一个非常经典的多线程模式,我们在实际开发中应用非常广泛的思 想理念。在生产消费模式中:通常由两类线程,即若干个生产者的线程和若干个消费者的线 程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务,在生产 者和消费者之间通过共享内存缓存区进行通信。具体代码逻辑实现思路:代码0:Main,外面使用的设计模式的类package com.bjsxt.chapter17.demo03;import java.util.concurrent.*;/** * @a原创 2021-02-24 16:49:29 · 153 阅读 · 0 评论 -
多线程设计模式——十六、Master-Worker设计模式
package com.bjsxt.chapter16;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;/** * @author wmr * @date 2021/2/23 */public class Master { // 存放任务的容器原创 2021-02-23 18:04:15 · 152 阅读 · 2 评论 -
多线程设计模式——十五、Future 设计模式
Future 模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交 订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送 Ajax 请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或 操作其他内容。代码1:Data接口package com.bjsxt.chapter15;/** * @author wmr * @date 2021/2/22 */public interface Data { String get原创 2021-02-22 17:45:14 · 197 阅读 · 2 评论 -
多线程设计模式——十四、Single Thread Execution 设计模式
14.1、机场过安检Single Thread Execution 模式是指在同一时刻只能有一个线程去访问共享资源,就 像独木桥一样每次只允许一人通行,简单来说, Single Thread Execution 就是采用排 他式的操作保证在同一时刻只能有一个线程访问共享资源。相信大家都有乘坐飞机的经历,在进入登机口之前必须经过安全检査,安检口类似于独 木桥,每次只能通过一个人,工作人员除了检査你的登机牌以外,还要联网检查身份证信息 以及是否携带危险物品,如下图所示。14.1.1、非线程安全先模拟一原创 2021-02-22 16:36:30 · 313 阅读 · 0 评论 -
并发编程核心——十三、并发Queue
在并发队列上 JDK 提供了两套实现,一个是以 ConcurrentLinkedQueue 为代表的高 性能队列,一个是以 BlockingQueue 接口为代表的阻塞队列,无论哪种都继承自 QueueConcurrentLinkedQueue是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能, 通常 ConcurrentLinkedQueue 性能好于 BlockingQueue。它是一个基于链接节点的无界 线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最原创 2021-02-20 18:05:34 · 298 阅读 · 5 评论 -
并发编程核心——十二、并发类容器
JDK 5.0 以后提供了多种并发类容器来替代同步类容器从而改善性能。同步类容器的 状态都是串行化的。他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时, 严重降低了应用程序的吞吐量。并发类容器是专门针对并发设计的,使用 ConcurrentHashMap 来代替给予散列的传 统的 HashTable,而且在 ConcurrentHashMap 中,添加了一些常见复合操作的支持。以 及使用了 CopyOnWriteArraylist 代替 Voctor,并发的 CopyOnWriteArrayS原创 2021-02-20 17:00:34 · 166 阅读 · 0 评论 -
并发编程核心——十一、同步类容器
同步类容器都是线程安全的,同步容器类包括 Vector 和 HashTable,二者都是早期 JDK 的一部分,此外还包括在 JDK1.2 当中添加的一些功能相似的类,这些同步的封装类是 由 Collections.synchronizedXxx 等工厂方法创建的。但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素, 遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条 件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便 是原创 2021-02-20 15:41:39 · 123 阅读 · 0 评论 -
并发编程核心——十、ThreadLocal
**Threadlocal 概念:**线程局部类型,是一种多线程间并发访问变量的解决方案。与其 synchronized 等加锁的方式不同, ThreadLocal 完全不提供锁,而使用以空间换时间的 手段,为每个线程提供变量的独立副本,以保障线程安全。从性能上说, ThreadLocal 不具有绝对的优势,在并发不是很高的时候,加锁的性能 会更好,但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景, 使用 ThreadLocal 可以在一定程度上减少锁竞争。**代码1:**封装了线原创 2021-02-20 14:43:37 · 103 阅读 · 2 评论 -
并发编程核心——九、阻塞队列
使用LOCK.notify,LOCK.wait模拟一个阻塞队列.阻塞队列也是一个队列,拥有队列某个时刻拥有元素数量,队列最大容纳元素数量,队列最小数量,队列这些属性。阻塞的含义是如果队列中元素个数与队列最大容纳元素数量相同,那么再放元素,放元素的线程会进入wait队列的阻塞状态,等待其他线程唤醒后才能放元素;如果队列中的元素个数与最小容纳元素数量相同,那么取数据的线程会进入wait队列的阻塞状态,等待其他线程唤醒后才能取数据。增加属性:锁操作:构造方法,私有属性的公有获取方法,获取队首元素的方法(加原创 2021-02-20 11:47:31 · 598 阅读 · 19 评论 -
并发编程核心——八、volatile 关键字
8.1、volatile 关键字的概念自 Java1.5 版本起, volatile 关鍵字所扮演的角色越来越重要,该关鍵字也成为并 发包的基础,所有的原子数据类型都以此作为修饰,相比 synchronized 关键字,volatile 被称为“轻量级锁”,能实现部分 synchronized 关键字的语义。volatile 概念: volatile 关键字的主要作用是使变量在多个线程间可见。下面我们 通过一个案例来了解一下 volatile:代码1:未加volatile关键字,一个线程读取变量为tr原创 2021-02-17 19:04:08 · 227 阅读 · 6 评论 -
并发编程核心——七、脏读
对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整 体,不然就会出现数据不一致的错误,很经典的错误就是脏读( dirtyread)示例代码如 下:package com.bjsxt.chapter07;import java.util.concurrent.TimeUnit;public class DirtyRead { private String username = "bjsxt"; private String password = "123";原创 2021-02-14 18:49:03 · 121 阅读 · 0 评论 -
并发编程核心——六、线程间通信
与网络通信等进程间通信方式不一样,线程间通信又称为进程内通信,多个线程实现互 斥访问共享资源时会互相发送信号或等待信号,比如线程等待数据到来的通知,线程收 到变量改变的信号等。本章将通过对一些案例的分析来学习 Java 提供的原生通信 API,以及这些通信机制背后的内幕。6.1、单线程间通信6.1.1、初识 wait 和 notify假设我们现在需要两个线程,一个负责生产数据,一个负责消费数据,理想状态下我们 希望一边生产一边消费,对于初学者而言可能首先想到的代码是这样子的:package com.原创 2021-02-14 18:44:31 · 108 阅读 · 0 评论 -
LOCK.notify()
当我在代码里面写Object LOCK=new Object();synchronized(LOCK){…LOCK.notify();…}其中LOCK.notify(),VM会做什么事情?好歹我英语过了六级,看源码。/** * Wakes up a single thread that is waiting on this object's * monitor. If any threads are waiting on this object, one of them * is c原创 2021-02-13 21:12:51 · 945 阅读 · 2 评论 -
并发编程核心——五.线程安全与数据同步
五、线程安全与数据同步本章我们将学习多线程中最复杂也是最重要的内容之一,那就是数据同步、线程安全、 锁等概念,在串行化的任务执行过程中,由于不存在资源的共享,线程安全的问题几乎不用 考虑,但是串行化的程序,运行效率低下,不能最大化地利用 CPU 的计算能力,随着 CPU 核数的增加和计算速度的提升,串行化的任务执行显然是对资源的极大浪费,比如 B 客户提 交了一个业务请求,只有等到 A 客户处理结束才能开始,这样的体验显然是用户无法忍受的。无论是互联网系统,还是企业级系统,在追求稳定计算的同时也在追求更原创 2021-02-12 19:11:10 · 599 阅读 · 2 评论 -
并发编程核心——四.ThreadAPI的详细介绍
第 2 章和第 3 章主要是从概念上区了解 Thread,本章中,我们将细致的学习 Thread 所有 API 的作用以及用法。4.1、线程 sleepsleep 是一个静态方法,其有两个重载方法,其中一个需要传入毫秒数,另外一个既需 要毫秒数也需要纳秒数。4.1.1、sleep 方法介绍public static void sleep (long millis) throws InterruptedExceptionpublic static void sleep (long millis, i原创 2021-02-11 20:52:06 · 432 阅读 · 8 评论 -
并发编程核心——三.深入理解 Thread 构造器
三、深入理解 Thread 构造器在 Java 中的 Thread 为我们提供了比较丰富的构造函数,在本章中,我们将会逐一介 绍每一个构造函数,以及分析其中一些可能并未引起你关注的细节。Thread 构造函数如下 图:3.1、线程的命名我们构造线程的时候可以为线程起一个有特殊意义的名字,这也是比较好的一种做法, 尤其在线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程 的跟踪,根据这个特性,我们可以将构造器分别两种,一种是构建时可以指定线程名称的, 一种是使用线程默认名称的。原创 2021-02-04 09:03:03 · 345 阅读 · 0 评论 -
并发编程核心——二多线程基础(续,接上)
cpu由运算器和控制器组成,内存、寄存器、缓存通过总线和cpu链接,完成数据的取,计算,放回。程序放在磁盘上,windows系统执行某一个exe文件,会将他加载到内存。比如,要执行一个helloworld.exe.这个用c++编写,被编译器编译后的的exe文件保存在d盘某目录下。当执行,被放在内存。如果是只有一个cpu,像过去那样,那么就会一行一行执行完exe。先输入,cpu等待,键盘获取数据。再计算,cpu运行。再输出,cpu等待。exe被执行完毕。输入,输出,cpu在等待,没有运行,程序员希望这个硬原创 2021-02-01 21:50:39 · 145 阅读 · 2 评论 -
并发编程核心——二多线程基础
二、多线程基础使用java代码的Thread就可以实现并行。前提是多个cpu的情况下。这个主要是来学习查看源码。以及核心内容。2.1、创建并启动线程案例:假设你想在浏览网页看新闻的同时还想听听音乐。2.2.1、尝试并行运行package com.bjsxt;/** * @author whl * @date 2020/10/14 */public class TryConcurrency01 { public static void main(String[] args) {原创 2020-10-14 18:34:13 · 335 阅读 · 2 评论 -
并发编程核心——一基本概念
主要内容(镇楼!)1.常见高并发基础:synchronized、volatile、happens-before、CAS、ThreadPoolExecutor、Executor、ThreadLocal、Condition、Semaphore;2.经典并发工具:automic、ABA、ReentrantLock、ReadWriteLock、Adder、Accumulator、 StampedLock、CopyOnWriteArrayList、ConcurrentHashMap、CopyOnWriteArra原创 2020-10-13 17:42:02 · 289 阅读 · 1 评论