JUC
文章平均质量分 78
努力学习的小飞侠
这个作者很懒,什么都没留下…
展开
-
Java之CompletableFuture思维导图
原创 2024-03-17 21:43:58 · 565 阅读 · 0 评论 -
Java之JMM思维导图
原创 2024-03-16 15:10:19 · 120 阅读 · 0 评论 -
Java之AQS思维导图
原创 2024-03-16 15:09:43 · 202 阅读 · 0 评论 -
CompletableFuture超详解与实践
Future类是异步思想的典型运用,主要用在一些需要执行耗时任务的场景避免程序一直原地等待耗时任务执行完成,执行效率太低。具体来说是这样的:当我们执行某一耗时的任务时,可以将这个耗时任务交给一个子线程去异步执行,同时我们可以干点其他事情,不用傻傻等待耗时任务执行完成。等我们的事情干完后,我们再通过Future类获取到耗时任务的执行结果。这样一来,程序的执行效率就明显提高了。这其实就是多线程中经典的Future 模式,你可以将其看作是一种设计模式,核心思想是异步调用。原创 2024-01-04 18:52:38 · 1615 阅读 · 0 评论 -
Java之ThreadLocal 详解
ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事物ID)与线程关联起来,并且每个线程隔离因为每个Thread内有自己的实例副本且该副本只有当前线程自己使用既然其他ThreadLocal不可访问,那就不存在多线程间共享问题。原创 2023-12-27 22:33:44 · 1454 阅读 · 0 评论 -
Java之Atomic 原子类总结
AtomicLong原理:CAS+自旋场景:低并发下的全局计算,AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性问题缺陷:高并发后性能急剧下降----AtomicLong的自旋会成为瓶颈(N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停自旋直至成功,这样大量失败自旋的情况,一下子cpu就打高了)LongAdder原理:CAS+Base+Cell数组分散-----空间换时间并分散了热点数据场景:高并发下的全局计算。原创 2023-12-25 22:42:05 · 982 阅读 · 0 评论 -
Java之Reentrantlock的实现及AQS的原理和应用
ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。原创 2023-12-25 16:37:42 · 1322 阅读 · 0 评论 -
Java之AQS(AbstractQueuedSynchronizer)
AQS 的全称为,翻译过来的意思就是抽象队列同步器。这个类在包下面。● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现● 是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给”谁“的问题。● 整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态。原创 2023-12-25 13:06:12 · 960 阅读 · 0 评论 -
Java AQS 核心数据结构-CLH 锁及优化
CLH 锁是对自旋锁的一种改进,有效的解决了以上的两个缺点。首先它将线程组织成一个队列,保证先请求的线程先获得锁,避免了饥饿问题。其次锁状态去中心化,让每个线程在不同的状态变量中自旋,这样当一个线程释放它的锁时,只能使其后续线程的高速缓存失效,缩小了影响范围,从而减少了 CPU 的开销。CLH 锁数据结构很简单,类似一个链表队列,所有请求获取锁的线程会排列在链表队列中,自旋访问队列中前一个节点的状态。当一个节点释放锁时,只有它的后一个节点才可以得到锁。原创 2023-12-25 00:50:01 · 1281 阅读 · 0 评论 -
Java之Synchronized与锁升级
锁升级的过程锁升级后,hashcode去哪儿了?● 各种锁优缺点、synchronized锁升级和实现原理。原创 2023-12-24 22:42:08 · 1193 阅读 · 0 评论 -
Java对象内存布局和对象头
Java对象内存布局和对象头在 HotSpot 虚拟机中,对象在内存中的布局分为三块区域:对象头,实例数据和对齐填充。对象头中包含两部分:MarkWord 和 类型指针。如果是数组对象的话,对象头还有一部分是存储数组的长度。多线程下 synchronized 的加锁就是对同一个对象的对象头中的 MarkWord 中的变量进行CAS操作。对象头(在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节)对象标记(Mark Word)默认存储对象的Hash原创 2023-12-24 21:42:21 · 436 阅读 · 0 评论 -
聊聊ThreadLocal
ThreadLocal并不解决线程间共享数据的问题ThreadLocal适用于变量在线程间隔离且在方法间共享的场景ThreadLocal通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题每个线程持有一个只属于它自己的专属map并维护了ThreadLocal对象与具体实例的映射,该Map由于只被持有他的线程访问,故不存在线程安全以及锁的问题ThreadLocalMap的Entry对ThreadLocal的引用为弱引用。避免了ThreadLocal对象无法被回收的问题。原创 2023-10-03 00:48:03 · 31 阅读 · 0 评论 -
原子操作类
AtomicLong原理:CAS+自旋场景:低并发下的全局计算,AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性问题缺陷:高并发后性能急剧下降----AtomicLong的自旋会成为瓶颈(N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停自旋直至成功,这样大量失败自旋的情况,一下子cpu就打高了)LongAdder原理:CAS+Base+Cell数组分散-----空间换时间并分散了热点数据场景:高并发下的全局计算。原创 2023-10-02 23:25:26 · 63 阅读 · 1 评论 -
CAS操作分析
CAS(compare and swap),中文翻译为比较并交换,实现并发算法时常用到的一种技术,用于保证共享变量的原子性更新,它包含三个操作数---内存位置、预期原值与更新值。原创 2023-10-02 13:33:46 · 63 阅读 · 1 评论 -
volatile与JMM
可见性:当写一个volatile变量时,JMM会把该线程对应的本地内存中共享变量的值立刻刷新会主存中当读一个volatile变量时,JMM会把线程的本地内存设置为无效,强制从主存中中读取最新共享变量的值所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取有序性:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,有时候会改变程序语句的先后顺序,若不存在数据依赖关系,可以重排序;存在数据依赖关系,禁止重排序;原创 2023-10-02 13:10:19 · 80 阅读 · 1 评论 -
Java内存模型之JMM(Java Memory Model)
CPU的运行并不是直接操作内存而是先把内存里面的数据读到缓存,而内存的读和写操作的时候会造成不一致的问题。JVM规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序再各种平台下都能达到一致性的内存访问效果。原创 2023-09-27 21:30:13 · 74 阅读 · 0 评论 -
LockSupport与线程中断
LockSupport与线程中断原创 2023-09-27 20:39:47 · 34 阅读 · 0 评论 -
Java多线程--锁详解
锁的详解(上)原创 2023-09-27 00:27:05 · 144 阅读 · 0 评论 -
JUC-CompletableFuture
可以看到CompletableFuture类实现了Future和CompletionStage两个接口代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发。原创 2023-09-26 16:49:31 · 63 阅读 · 0 评论