
JUC并发编程
文章平均质量分 92
学习阳哥JUC课程笔记
问剑白玉京
我要进大厂!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【JUC-AQS】JDK17 AQS源码分析
在学习阳哥的的时候,阳哥讲AQS用的是JDK8,我用的是JDK17,想着自己分析一下,分析完之后发现JDK17与JDK8还是有些不同的,感觉更高效了。原创 2024-06-06 19:03:34 · 900 阅读 · 1 评论 -
【JUC-锁升级】简要版本
为什么不全部使用Synchronized、Lock等重量级锁呢?重量级锁底层是基于操作系统的互斥锁实现的,涉及到用户态与内核态之间的切换。原创 2024-12-04 19:19:42 · 611 阅读 · 0 评论 -
Java对象布局|对象头锁状态
Java对象内存布局一、内存对象布局二、对象标记三、类型指针四、实例数据一、内存对象布局Java对象布局分为三类:对象头、实例数据、对齐填充。对象头又细分为两类:类型指针、对象标记:为什么对象头有这两部分呢?其实想想也很简单,在前几章我们知道每个对象都可以作为管程,那就需要知道当前对象被哪个线程持有,这部分信息存储在哪里呢? GC的时候,如何记录当前对象经历了几次GC?当前对象的hashcode存储在哪里?这些东西都存储在对象头的对象标记中。类型指针表明了当前对象是什么类型,指向方法区的某一个原创 2024-12-03 11:46:32 · 880 阅读 · 0 评论 -
【JUC-ThreadLocal】
之前在JMM章节我们提到,线程不能直接修改主存中的变量,应该将变量复制一份到本地栈内存,由此引发了一系列线程并发安全的问题。TheadLocal,从名字上看,线程局部,该方法提供了线程局部变量。ThreadLocal的值是每个线程独有的,因为独有,所以不存在什么竞争问题。下面看一个例子,简单的使用一下API: 5个销售卖房子,需要知道每个销售卖多少,以及总共卖了多少。// 赋值初始值// 统计最终买了多少个i < 5;原创 2024-12-02 15:57:19 · 581 阅读 · 0 评论 -
【JUC-Atomic原子类】含LongAdder源码探究
这种操作的时候也无法保证原子性,需要加锁保证。统计base + 各个窗口的值,不保证精确,因为有些线程可能还在窗口自旋的尝试修改,没办法累加起来。上面都是Java内部的原子类,如何让自己写的类也成为原子类?在低竞争下,两个类的效率相似,但是当线程竞争激烈的时候,这里我们从头模拟一下,假设初始的时候(new 出来),分散一下压力,会更快,但是相应的,统计就不会那么准确了。就好比开了好几个窗口,将热点分散,减少自旋的时间。类似,像这种只有类型不同的,我们只看一个就行了。锁普通方法,锁的是当前实例对象,包括。原创 2024-11-30 15:39:21 · 869 阅读 · 0 评论 -
【JUC-CAS】原子类基础
虽然对 input 执行了一些基本检查,但这些检查是尽力而为的,并且当性能是压倒一切的优先级时,例如当运行时编译器优化此类的方法时,可能会省略部分或全部检查(如果有)。自旋锁其实采用了CAS的思想,不对共享资源加锁,如果内存中的值不是我手中的值,我就把内存中的值拿过来,继续比较,如果是,做交换。,比较并交换,工作流程就是比较内存中的值与我现在获取的是否一致,如果一致才做修改,否则什么也不做。类中,由于操作的是底层资源,是不安全的,所以类也命名成。,就是调用了底层的指令,并对总线加锁保证原子性。原创 2024-11-29 16:29:20 · 302 阅读 · 0 评论 -
【JUC-Volatile】
中,我们提到程序在运行过程中,并不是按照我们写的代码顺序执行的,如果修改代码位置之后与串行执行之后结果一致,那么允许指令重排,但是只保证单线程下的安全。加一放回主存中,这时候缓存一致性协议就生效了,告知B线程中的值已经是旧的了,本次操作就无效了。高并发环境下可能会发生后续情况:线程A,B分别将主存中的值读到本地栈内存中,然后A先将。A:在编译成指令的前后加上相应的屏障,重排序的时候就会保证对应的操作发生。是Java中的一个关键字,被其修饰的变量,可以保证保证多线程环境下的。粗分,分为读屏障与写屏障。原创 2024-11-28 13:50:05 · 764 阅读 · 0 评论 -
【JUC-JMM】Java Memory Model Java内存模型
JMM规定,任何线程不能直接操作主内存中的变量,应该先将主内存的变量复制一份到本地独立栈空间内,然后进行操作,操作完之后,将变量写回主内存,线程B再读取主存中的值就是最新的了。带着这个问题,学过计算机组成原理的同学应该知道,CPU中寄存器的访问速度很快,内存的访问速度相较来说,比较慢,为了协调CPU中寄存器与内存的访问速度差异,设计了。那么,我们不禁思索,Java内存模型有什么用,是用来做什么的呢?有了缓存之后,我们尽可能操作缓存中的数据,接下来问题来了,如果缓存中的数据被修改了,会造成缓存与内存中数据。原创 2024-11-26 21:59:22 · 1057 阅读 · 0 评论 -
【JUC-LockSupport】阻塞唤醒机制
调用了 park,那么当这个线程再次显式调用 park 时,它可能会错过由另一个线程发出的 unpark 请求,从而导致该线程无法继续执行,即出现“丢失的解除暂停”问题。当线程被阻塞时,会记录这个对象,以便监控和诊断工具能够识别线程被阻塞的原因。的时候,如果指定的线程没有许可,会给指定的线程发放一个许可;如果指定的线程有许可了,什么也不做,因为一个线程的。首先从名称上看,锁支持, 是一种用于线程间阻塞唤醒的机制,脑海中没有概念的可以想一下生产者消费者模型。此外,如果调用者的线程被中断,原创 2024-11-26 13:44:49 · 887 阅读 · 0 评论 -
【JUC-Interrupt】中断相关概念
Java并没有给中断提供额外的语法,中断过程完全需要程序员自己实现,调用相关API如。如果执行这个方法的线程不是本身(因为别的线程也能调用你的这个方法),将会调用。如果编程的时候没有注意上面这一点,可能没有办法中断线程,引起不可预知的错误。在Java中没有办法立即停止一个线程,因此提供了用于停止线程的。NIO部分不太清楚,大致意思也是会设置中断位。2024-11-25 23点08分。一个线程不应该由其他线程中断或停止,应该有。如果线程因为I/O操作阻塞,调用。将会设置中断位,但是会报一个错误。原创 2024-11-25 23:08:43 · 938 阅读 · 0 评论