JUC
文章平均质量分 96
java并发
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
Java的AQS框架是如何支撑起整个并发库的
Java的AQS框架是如何支撑起整个并发库的原创 2023-08-17 23:55:28 · 677 阅读 · 1 评论 -
独特视角带你走进Java并发编程的世界
一篇文章彻底拿下java并发编程原创 2023-03-19 23:35:37 · 358 阅读 · 0 评论 -
从一次转账探究并发优化的思路
由线程上下文切换导致的原子性问题可以通过锁来解决,我们可以直接使用jvm层面提供的synchronized锁。锁定的对象是哪个锁定的对象和需要保护的资源之间关系临界区范围有多大,即在哪里加锁,在哪里解锁梳理好对资源的所有访问路径,所有的访问路径都需要设置合适的锁对于没有关联关系的多个资源而言,通过都是一个资源对应一把锁,这种锁我们也称之为细粒度锁。原创 2023-03-06 11:50:43 · 411 阅读 · 0 评论 -
java内存模型的理解
如果线程 B 读到了“v=true”,那么线程 A 设置的“x=42”对线程 B 是可见的。在java中,Happens-Before规则本质还是一种可见性,A Happens-Before B,意味着A事件对B事件来说是可见的,无论A事件和B事件是否发生在同一个线程里,例如: 事件A发生在线程1,事件B发生在线程2,Happens-Before规则保证线程2上也能看到A事件的发送。还是文中给出的案例,大家思考会不会产生x=42和v=true重排序,导致线程B读取到x=0的结果呢?原创 2023-03-05 14:21:23 · 603 阅读 · 0 评论 -
Java 读写锁 ReentrantReadWriteLock 源码分析
(全文完)转载 2022-10-18 22:26:26 · 142 阅读 · 0 评论 -
CompletableFuture入门
同时实现了Future和接口。}除了提供了更为好用和强大的Future特性之外,还提供了函数式编程的能力。Future:尝试取消执行任务。:判断任务是否被取消。: 判断任务是否已经被执行完成。get():等待任务执行完成并获取运算结果。:多了一个超时时间。接口中的方法比较多,的函数式能力就是这个接口赋予的。从这个接口的方法参数你就可以发现其大量使用了 Java8 引入的函数式编程。由于方法众多,所以这里不能一一讲解,下文中我会介绍大部分常见方法的使用。转载 2022-10-18 09:32:50 · 799 阅读 · 0 评论 -
Atomic 原子类总结
Atomic 原子类介绍基本类型原子类基本类型原子类介绍AtomicInteger 常见方法使用基本数据类型原子类的优势AtomicInteger 线程安全原理简单分析数组类型原子类数组类型原子类介绍AtomicIntegerArray 常见方法使用引用类型原子类引用类型原子类介绍AtomicReference 类使用示例AtomicStampedReference 类使用示例AtomicMarkableReference 类使用示例对象的属性修改类型原子类对象的属性修改类型原子类介绍。转载 2022-10-17 22:25:55 · 205 阅读 · 0 评论 -
AQS 详解
AQS 的全称为,翻译过来的意思就是抽象队列同步器。这个类在包下面。AQS 就是一个抽象类,主要用来构建锁和同步器。}.}.}AQS 为构建锁和同步器提供了一些通用功能的是实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的,Semaphore,其他的诸如,,FutureTask(jdk1.7) 等等皆是基于 AQS 的。转载 2022-10-17 22:07:12 · 252 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。转载 2022-10-17 20:59:35 · 85 阅读 · 0 评论 -
Java 常见并发容器总结
CopyOnWriteArrayList 简介CopyOnWriteArrayList 是如何做到的?CopyOnWriteArrayList 读取和写入源码简单分析CopyOnWriteArrayList 读取操作的实现CopyOnWriteArrayList 写入操作的实现BlockingQueue 简介参考JDK 提供的这些容器大部分在包中。: 线程安全的HashMap: 线程安全的List,在读多写少的场合性能非常好,远远好于Vector。: 高效的并发队列,使用链表实现。转载 2022-10-16 21:38:58 · 318 阅读 · 0 评论 -
CompletableFuture进阶篇-外卖商家端API的异步化
CompletableFuture是由Java 8引入的,在Java8之前我们一般通过Future实现异步。Future用于表示异步计算的结果,只能通过阻塞或者轮询的方式获取结果,而且不支持设置回调方法,Java 8之前若要设置回调一般会使用guava的ListenableFuture,回调的引入又会导致臭名昭著的回调地狱(下面的例子会通过ListenableFuture的使用来具体进行展示)。转载 2022-10-16 17:06:09 · 1351 阅读 · 4 评论 -
CompletableFuture入门篇
上面的代码中,任务 A、B、C、D 依次执行,如果任务 A 抛出异常(当然上面的代码不会抛出异常),那么后面的任务都得不到执行。的方法,表达的都是一个意思,指的是两个任务中的其中一个执行完成,就执行指定的操作。上面一节,我们说的是,任务 A 执行完 -> 任务 B 执行完 -> 执行任务 C,它们之间有先后执行关系,因为后面的任务依赖于前面的任务的结果。最后一行的 join() 方法会返回最先完成的任务的结果,所以它的泛型用的是 Object,因为每个任务可能返回的类型不同。这也是它的一个缺点。转载 2022-10-16 10:36:39 · 828 阅读 · 0 评论 -
线程池动态自适应变化
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。降低资源消耗。转载 2022-10-15 19:51:24 · 624 阅读 · 0 评论 -
Java 线程池最佳实践
一般建议是不同的业务使用不同的线程池,配置线程池的时候根据当前业务的情况对当前线程池进行配置,因为不同的业务的并发以及对资源的使用情况都不同,重心优化系统性能瓶颈相关的业务。转载 2022-10-15 18:45:01 · 498 阅读 · 0 评论 -
Java 线程池详解
Executor框架是 Java5 之后引进的,在 Java 5 之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。补充:this 逃逸是指在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误。Executor框架不仅包括了线程池的管理,还提供了线程工厂、队列以及拒绝策略等,Executor框架让并发编程变得更加简单。线程池实现类是。转载 2022-10-15 10:27:59 · 144 阅读 · 0 评论 -
并发阻塞队列BlockingQueue解读
ArrayBlockingQueue 底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。LinkedBlockingQueue 底层是链表,可以当做无界和有界队列来使用,所以大家不要以为它就是无界队列。SynchronousQueue 本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。PriorityBlockingQueue 是无界队列,基于数组,数据结构为二叉堆,数组第一个也是树的根节点总是最小值。原创 2022-10-14 21:43:27 · 478 阅读 · 0 评论 -
JUC线程池扩展可回调的Future
实际上,这里定义的方法Executor#execute()是整套线程池体系最核心的接口,也就是ThreadPoolExecutor定义的核心线程、额外创建的线程(线程池最大线程容量 - 核心线程数)都是在这个接口提交任务的时候懒创建的,也就是说ExecutorService接口扩展的功能都是基于Executor#execute()的基础进行扩展。当然,本文只是提供一个十分简陋的实现,笔者其实还想到了如对回调处理的耗时做监控、回调打上分组标签执行等等更完善的功能,等到有需要的场景再进行实现。转载 2022-10-12 17:57:15 · 229 阅读 · 0 评论 -
Java中的Future是如何实现的
在上一篇文章ThreadPoolExecutor线程池设计思路中,我们已经详细分析了JUC线程池设计架构,那么本篇文章我们将着眼于线程池扩展服务ExecutorService接口的实现源码,同时会重点分析Future的底层实现。转载 2022-10-12 16:27:34 · 956 阅读 · 1 评论 -
ThreadPoolExecutor线程池设计思路
本篇文章我将会尝试用自己的语言,用我个人的想法来阐述一下ThreadPoolExecutor的设计思路。首先,我们来看一下ThreadPoolExecutor的继承体系:Executor意为执行器,作为顶层抽象接口,提供了一个execute方法来执行传入的任务,而该任务如何被执行,则是由不同实现子类来决定的。其次,我们还需要考虑到对任务管理接口的统一,例如: 停止任务,提交任务等… 。 因为,每个不同的子类实现,都有对任务管理的需求,因此我们需要统一任务管理相关接口,防止混乱。任务管理相关接口由Exec原创 2022-10-03 23:24:37 · 446 阅读 · 0 评论 -
图解 | 你管这破玩意叫线程池?
小宇:嗯好的,首先它的构造方法是这个样子滴{... // 省略一些参数校验}这些参数分别是:核心线程数:最大线程数:非核心线程的空闲时间:空闲时间的单位:任务队列(线程安全的阻塞队列):线程工厂:拒绝策略整个任务的提交流程是闪客:不错不错,这可是你自己总结的哟,现在还用我给你讲什么是线程池了么?小宇:啊天呢,我才发现这似乎就是我一直弄不清楚的线程池的参数和原理呢!闪客:没错,而且最后一版代码的构造方法,就是 Java 面试常考的最长的那个构造方法,参数名都没变。小宇:哇,太赞了!转载 2022-10-02 22:01:44 · 179 阅读 · 0 评论 -
老板让只懂Java基本语法的我,基于AQS实现一个锁
是一个 JDK 源码中的一个。转载 2022-09-30 19:25:46 · 104 阅读 · 0 评论 -
AQS源码剖析第三篇--共享模式
这篇,我们的关注点是 AQS 最后的部分,AQS 共享模式的使用。本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier、Semaphore 的源码一起过一下。原创 2022-10-02 21:41:00 · 661 阅读 · 0 评论 -
AQS源码剖析第二篇--公平与非公平,条件队列和线程中断
这篇文章说的是 AbstractQueuedSynchronizer,只不过好像 Condition 说太多了,赶紧把思路拉回来。接下来,我想说说怎么取消对锁的竞争?try {for(;;) {} }首先,到这个方法的时候,节点一定是入队成功的。}这两段代码联系起来看,是不是就清楚了。如果我们要取消一个线程的排队,我们需要在另外一个线程中对其进行中断。比如某线程调用 lock() 老久不返回,我想中断它。一旦对其进行中断,此线程会从中唤醒,然后返回 true。转载 2022-10-02 11:49:21 · 345 阅读 · 0 评论 -
AQS源码剖析第一篇---全貌概览
JDK1.5引入了LockSupport类,底层是基于Unsafe类的park()和unpark()方法,提供了线程阻塞和唤醒的功能,它的机制有点像只有一个允许使用资源的信号量java.util.concurrent.Semaphore,也就是一个线程只能通过park()方法阻塞一次,只能调用unpark()方法解除调用阻塞一次,线程就会唤醒(多次调用unpark()方法也只会唤醒一次),可以想象是内部维护了一个0-1的计数器。从实现上看,CLH锁是一种自旋锁,能确保无饥饿性,提供先来先服务的公平性。原创 2022-10-01 21:19:55 · 665 阅读 · 0 评论 -
JUC学习之线程安全集合类
JUC学习之线程安全集合类线程安全集合类概述ConcurrentHashMapConcurrentHashMap 原理1. JDK 7 HashMap 并发死链注意死链复现源码分析小结JDK 8 ConcurrentHashMap构造器分析get 流程put 流程size 计算流程总结JDK 7 ConcurrentHashMapput 流程rehash 流程get 流程size 计算流程LinkedBlockingQueue 原理1. 基本的入队出队加锁分析性能比较ConcurrentLinkedQueu原创 2022-01-10 15:49:58 · 3062 阅读 · 0 评论 -
JUC学习之共享模型工具之JUC并发工具包下
JUC学习之共享模型工具之JUC并发工具包下StampedLock加解读锁加解写锁Semaphore基本使用限制对共享资源的使用semaphore 实现单位时间内限流guava 实现Semaphore 原理1. 加锁流程2.解锁流程源码为什么要有 PROPAGATE正常流程产生 bug 的情况bug 修复后CountdownLatch应用之同步等待多线程准备完毕应用之同步等待多个远程调用结束CyclicBarrierStampedLock该类自 JDK 8 加入,是为了进一步优化读性能,它的特点是在使原创 2022-01-08 21:48:04 · 749 阅读 · 0 评论 -
JUC学习之共享模型工具之JUC并发工具包上
JUC学习之共享模型工具之JUC并发工具包AQS 原理概述实现不可重入锁AQS 原理概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占原创 2022-01-08 14:58:09 · 578 阅读 · 0 评论 -
JUC学习之共享模型之工具上之线程池浅学
JUC学习之共享模型之工具线程池1. 自定义线程池ThreadPoolExecutornewFixedThreadPool----固定大小的线程池自定义线程工厂newCachedThreadPoolnewSingleThreadExecutor提交任务相关的方法submit方法invokeAll方法invokeAny方法关闭线程池shutdownshutdownNow其它方法使用演示异步模式之工作线程1. 定义2. 饥饿创建多少线程池合适CPU 密集型运算I/O 密集型运算任务调度线程池ScheduledE原创 2022-01-05 16:48:13 · 413 阅读 · 0 评论 -
JUC学习之不可变
JUC学习之不可变日期转换的问题解决方法一: 加同步锁解决思路二: 使用不可变对象不可变设计final的使用保护性拷贝享元模式包装类String 串池BigDecimal BigInteger连接池案例final 原理1. 设置 final 变量的原理2. 获取 final 变量的原理日期转换的问题问题提出:下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的package Immuate;import lombok.extern.slf4j.Slf4j;import原创 2022-01-02 23:26:52 · 869 阅读 · 1 评论 -
JUC学习之无锁---乐观锁(非阻塞)
JUC学习之无锁---乐观锁(非阻塞CAS 与 volatile问题提出CAS 与 volatile问题提出有如下需求,保证 account.withdraw 取款方法的线程安全package cas;import java.util.ArrayList;import java.util.List;interface Account { // 获取余额 Integer getBalance(); // 取款 void withdraw(Integer amount); /*原创 2021-12-30 18:52:49 · 329 阅读 · 0 评论 -
JUC学习之共享模型之内存
JUC学习之共享模型之内存Java 内存模型可见性退不出的循环解决方法两阶段终止模式interrupt实现volatile实现同步模式之 Balking定义实现指令重排有序性指令级并行原理名词Clock Cycle TimeCPIIPC鱼罐头的故事指令重排序优化支持流水线的处理器SuperScalar 处理器CPU 缓存结构原理1. CPU 缓存结构2.CPU 缓存读3. CPU 缓存一致性诡异的结果解决方法volatile 原理内存屏障1. 如何保证可见性2.如何保证有序性volatile 不能解决指令交原创 2021-12-25 16:44:18 · 474 阅读 · 0 评论 -
JUC坑点记录
JUC坑点记录tomcat中threadlocal使用采坑记录tomcat中threadlocal使用采坑记录tomcat默认使用线程池来管理线程,即当收到一个请求时,如果线程池存在空闲线程,则会从中取出一个空闲线程来处理该请求。当一个线程在处理请求时,其他请求就不会被分配至该线程。例如有a,b,c三个空闲线程:1、当request1到来时,分配a线程来处理2、同时有request2到来,此时a线程在处理中,因此只有bc两个空闲线程,则会从中选一个处理request2。3、request1处理原创 2021-12-22 23:23:55 · 134 阅读 · 0 评论 -
JUC共享模型下
JUC共享模型下wait notify小故事 - 为什么需要 waitwait notify 原理API 介绍wait notify 的正确姿势sleep(long n) 和 wait(long n) 的区别使用案例案例优化1虚假唤醒问题演示案例优化2案例优化3wait和notify模板写法同步模式之保护性暂停1. 定义2. 实现应用带超时版 GuardedObject原理之 join多任务版 GuardedObject实现异步模式之生产者/消费者1. 定义2. 实现应用Park & Unpark基原创 2021-12-22 22:22:55 · 466 阅读 · 0 评论 -
JUC学习之共享模型上
JUC学习之共享模型之管型共享带来的问题Java 的体现临界区 Critical Section竞态条件 Race Conditionsynchronized 解决方案synchronized语法解决图解面向对象改进方法上的 synchronized不加 synchronized 的方法线程八锁案例变量的线程安全分析成员变量和静态变量是否线程安全?局部变量是否线程安全?局部变量线程安全分析常见线程安全类线程安全类方法的组合不可变类线程安全性实例分析导读: 共享问题 synchronized 线程原创 2021-12-19 14:36:14 · 742 阅读 · 0 评论 -
JUC学习之Java 线程常用方法
JUC基础入门原创 2021-12-12 20:29:06 · 590 阅读 · 0 评论 -
JUC学习之预热知识
JUC学习之预热知识进程与线程进程线程二者对比并行与并发应用应用之异步调用(案例1)应用之提高效率(案例2)案例---验证多核cpu对效率的提升,单核cpu无法提升环境搭建结论进程与线程进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以原创 2021-12-11 16:24:54 · 236 阅读 · 0 评论