多线程与并发控制
文章平均质量分 89
多线程与并发控制
阳宗德
诚然,程序员应该重视代码,但眼里也不应该只有代码,很多代码之外的东西也很精彩。工作也是为了更好的生活,多看看身边的事,多关心身边的人,终究我们还是要回归到平凡的生活中。
我们所热爱的,就是自己的生活!
展开
-
多线程8:从ReentrantLock的实现看AQS的原理及应用
了解 AQS 基本原理以后,按照上面所说的 AQS 知识点,自己实现一个同步工具。} }通过我们自己定义的 Lock 完成一定的同步功能。} } };} }上述代码每次运行结果都会是 20000。通过简单的几行代码就能实现同步功能,这就是 AQS 的强大之处。我们日常开发中使用并发的场景太多,但是对并发内部的基本框架原理了解的人却不多。转载 2023-02-21 19:10:36 · 73 阅读 · 0 评论 -
多线程7:jvm内存模型
Java 是最早尝试提供内存模型的编程语言。由于早期内存模型存在一些缺陷(比如非常容易削弱编译器的优化能力),从 Java5 开始,Java 开始使用新的内存模型。一般来说,编程语言也可以直接复用操作系统层面的内存模型。不过,不同的操作系统内存模型不同。如果直接复用操作系统层面的内存模型,就可能会导致同样一套代码换了一个操作系统就无法执行了。Java 语言是跨平台的,它需要自己提供一套内存模型以屏蔽系统差异。这只是 JMM 存在的其中一个原因。转载 2023-02-21 19:09:25 · 105 阅读 · 0 评论 -
多线程7:乐观锁和悲观锁详解
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。转载 2023-02-21 19:08:15 · 180 阅读 · 0 评论 -
多线程6:原子类
Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包的原子类都存放在下,如下图所示。转载 2023-02-21 19:07:47 · 337 阅读 · 0 评论 -
多线程5:多线程池最佳实践
线程池必须手动通过的构造函数来声明,避免使用Executors类创建线程池,会有 OOM 风险。Executors和: 使用的是无界的,任务队列最大长度为,可能堆积大量的请求,从而导致 OOM。:使用的是同步队列, 允许创建的线程数量为,可能会创建大量线程,从而导致 OOM。**和** : 使用的无界的延迟阻塞队列,任务队列最大长度为,可能堆积大量的请求,从而导致 OOM。使用有界队列,控制线程创建数量。除了避免 OOM 的原因之外,不推荐使用Executors。转载 2023-02-21 19:05:49 · 291 阅读 · 0 评论 -
多线程4:线程池的基本概念以及核心原理
顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。转载 2023-02-21 19:04:21 · 253 阅读 · 0 评论 -
多线程3:多线程,死锁,线程池,CAS,AQS
顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。转载 2023-02-21 19:01:55 · 111 阅读 · 0 评论 -
多线程2:多线程,死锁,synchronized,ReentrantLock,volatile,ThreadLocal,线程池,CAS,AQS
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。转载 2023-02-21 19:02:01 · 135 阅读 · 0 评论 -
多线程1:线程和进程,并发和并行,多线程,死锁,线程的生命周期
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。如下图所示,在 Windows 中通过查看任务管理器的方式,我们就可以清楚看到 Windows 当前运行的进程(.exe文件的运行)。转载 2023-02-21 18:59:00 · 77 阅读 · 0 评论 -
线程学习总结(全面)
1.线程概述进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。线程:就是在一个进程中负责一个执行路径。多线程:就是在一个进程中多个执行路径同时执行。图上的一键优化与垃圾清除同时在运行,在一个进程中同时在执行了多个任务。假象:电脑上的程序同时在运行。“多任务”操作系统能同时运行多个进程(程序)——但实际是由于CPU分时机制的作用,使每个进程都...原创 2019-05-26 20:22:14 · 1486 阅读 · 0 评论 -
CopyOnWriteArrayList
初识CopyOnWriteArrayList第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在com.mysql.jdbc.Driver下,也就是我们写Class.forName(“…”)中的内容:public class Driver exten...转载 2020-03-19 10:47:42 · 249 阅读 · 0 评论 -
JAVA如何让多个线程顺序执行?
直接代码说明/** * 顺序执行多线程 * @author GaoYuan */public class SortThread { public static void main(String[] args) throws Exception{ /** * 方法一 * 利用newSingleThreadExecutor() */ Thread thread1 = new Thread(() ->原创 2020-10-11 10:37:14 · 513 阅读 · 2 评论 -
CompletionService按序获取线程结果
文章目录使用场景原理api使用场景1:提交了多个任务,但只要有一个任务完成并返回一个非空的结果,并可以忽略掉其余的任务场景2:提交了多个任务,按执行完成顺序获取结果传统做法弊端使用场景多个线程,先执行完的进阻塞队列,然后可以按执行顺序获取结果提交了多个任务,但只要有一个任务完成并返回一个非空的结果,忽略掉其余的任务原理内部维护了一个阻塞队列,提交的任务,先执行完的先进入队列,所以获取值肯定是按:执行完成的顺序。apiFuture submit(Callable task);submit原创 2021-05-20 09:10:43 · 315 阅读 · 0 评论 -
Java多线程编程核心
文章目录Java多线程编程入门1. 多线程编程基础1.1 进程、线程1.2 使用多线程1.3 线程常用API1.4 停止线程1.5 暂停线程1.6 yield方法1.7 线程的优先级1.8 守护线程2. 线程的同步机制2.1 synchronized同步方法2.2 synchronized同步语句块2.3 volatile关键字3. 线程间的通信3.1 wait与notify3.2 join方法3.3 ThreadLocal类4. Lock4.1 ReentranLock4.2 ReentrantReadW原创 2021-04-25 21:24:12 · 246 阅读 · 0 评论 -
Fork-Join分治编程框架
文章目录概念普通线程池实现分治使用普通的线程池实现普通的线程池实现例子Fork-Join 框架使用工作窃取算法Fork-Join 框架的使用介绍例子概念Fork/Join框架是Java7提供了的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架,这种开发方法也叫 分治编程。分治编程可以极大地利用CPU资源,提高任务执行的效率,也是目前与多线程有关的前沿技术。普通线程池实现分治注意:存在线程阻塞等问题使用普通的线程池实现我们往一个线程池提交翻译 2021-05-20 09:41:41 · 150 阅读 · 0 评论 -
手动事务及多线程事务
文章目录1. 什么是事务?2.事务的特性(ACID)3.Spring 支持两种方式的事务管理1).编程式事务管理2)声明式事务管理多线程事务解决1)定义线程外集合,将线程处理结果放入集合,由外部线程处理2)定义线程外手动事务集合,将线程事务放入集合,由外部线程处理事务1. 什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。另外,需要格外注意的是:事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为 myisa原创 2021-05-18 11:26:41 · 3880 阅读 · 11 评论 -
springboot线程池统一线程定义和使用
1.我们都知道spring只是为我们简单的处理线程池,每次用到线程总会new 一个新的线程,效率不高,所以我们需要自定义一个线程池。2.自定义线程池有两种方法,第一种自定义线程池然后使用自己的自定义的,第二种重写spring默认的线程池,然后使用自己重写过的线程池文章目录一:重写spring默认的线程池二:自定义线程池配置类三:使用四:工具类和注解等一:重写spring默认的线程池import lombok.Data;import lombok.EqualsAndHashCode;import原创 2021-05-12 11:07:58 · 2878 阅读 · 0 评论 -
AQS原理以及AQS同步组件总结
1 AQS 简单介绍2 AQS 原理2.1 AQS 原理概览2.2 AQS 对资源的共享方式2.3 AQS 底层使用了模板方法模式3 Semaphore(信号量)-允许多个线程同时访问4 CountDownLatch (倒计时器)4.1 CountDownLatch 的三种典型用法4.2 CountDownLatch 的使用示例4.3 CountDownLatch 的不足4.4 CountDownLatch 常见面试题5 CyclicBarrier(循环栅栏)5.1..转载 2021-04-27 13:33:52 · 158 阅读 · 0 评论 -
并发容器总结
一 JDK 提供的并发容器总结二 ConcurrentHashMap三 CopyOnWriteArrayList3.1 CopyOnWriteArrayList 简介3.2 CopyOnWriteArrayList 是如何做到的?3.3 CopyOnWriteArrayList 读取和写入源码简单分析3.3.1 CopyOnWriteArrayList 读取操作的实现3.3.2 CopyOnWriteArrayList 写入操作的实现四 ConcurrentLinkedQue..转载 2021-04-27 13:29:29 · 86 阅读 · 0 评论