并发编程
文章平均质量分 84
java并发进阶
专注写bug
你知道的越多,你不知道的也越多!
展开
-
Java——线程中断理解说明
文章目录前言中断概念的由来什么是中断?探究不同线程状态下的中断情况NEW 新生TERMINATED 消亡RUNNABLE 运行时BLOCKED 阻塞WAITING/TIMED_WAITING中断的作用前言最近看AQS源码,看到了线程中断的概念,有点迷糊,写篇文章总结汇总下。中断概念的由来在早期JDK中,开发者可以根据Thread中的stop()来实现线程的关闭操作,但难免会出现一些问题。如果批量数据处理,耗时。此时执行stop(),导致线程直接关闭。可能导致一些意想不到的负面问题。但是,原创 2022-02-14 17:52:06 · 419 阅读 · 0 评论 -
AQS——ReentrantLock源码中线程中断补充
文章目录问题来源关于线程唤醒中断唤醒演示LockSupport.unpark 唤醒阻塞线程中断唤醒阻塞线程为什么会有 selfInterrupt() 操作?使用 lockInterruptibly()原理图分析正常情况下的队列假设T2和T3出现中断问题来源在JUC下的ReentrantLock,针对线程的加锁操作。使用lock.lock()。但在其源码中,却存在一个很可疑的代码逻辑,如下图所示:final void lock() { acquire(1);}public final v原创 2021-10-14 21:08:55 · 675 阅读 · 1 评论 -
Java——线程五大状态
文章目录线程状态状态描述线程状态状态描述原创 2021-10-11 20:41:40 · 1078 阅读 · 2 评论 -
Java——死锁的产生和分析
文章目录死锁的由来死锁产生的条件demo演示死锁死锁出现原因图谱分析死锁1、jps -l 查看程序执行的进程2、通过 jstack -l pid 查看堆栈内存死锁的由来在实际开发中,并发开发中难免会碰见死锁的问题。出现死锁问题后,程序中的现象为:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。死锁产生的条件1、互斥使用。当资源被一个线程使用(占有)时,别的线程不能使用。2、不可抢占。资源请求者不能强制从资源占有者手中夺取资源,原创 2021-10-09 11:07:38 · 169 阅读 · 0 评论 -
CAS——ABA问题说明及解决方式
文章目录什么是ABAABA问题案例演示ABA问题解决AtomicStampedReference 参数说明类和构造compareAndSet 比较和设置注意一个BUG结语什么是ABA说明这个问题之前,我们需要先看什么是CAS?CAS全名为CompareAndSwap,也就是比较与交换。多个线程同时操作同一个共享变量时,总会出现一些高并发类型的问题。单应用环境下,通常采取synchronized或者ReentrantLock等方式保证数据的正确性。其实CAS也能保证。针对CAS的原理,可以参考原创 2021-10-08 19:42:03 · 460 阅读 · 1 评论 -
Demo说明什么是自旋锁
文章目录概述手写一个自旋锁测试自旋锁执行后的结果概述在程序开发中比较常见,所有的线程去争抢一个共同的资源时,为了避免出现超买、超卖等并发问题,此时需要对其进行加锁和解锁操作。自旋锁在Java源码中和各种框架中都广泛使用,其本质就是一个死循环。当通过CAS算法执行失败时,则一直死循环等待何时可以获取到锁。当前一个线程释放锁成功后,后面的线程CAS算法比较和交换操作执行成功后,方可跳出循环。如Java中sun.misc.Unsafe#getAndAddInt的源码部分一样:手写一个自旋锁接原创 2021-10-08 16:49:15 · 262 阅读 · 1 评论 -
AQS——ReentrantLock 源码详解
文章目录什么是AQS什么是AQSAQS是在Java中AbstractQueuedSynchronizer的缩写。他的含义是抽象的队列式的同步器。在JUC(java.util.concurrent)中,很多和锁有关的操作类,都会依赖他。比如下面博客需要说道的ReentrantLock。针对ReentrantLock的简单使用,可以参考之前博客 java.util.concurrent.locks.Lock锁 。...原创 2021-09-29 18:17:53 · 309 阅读 · 2 评论 -
CAS的原理理解
文章目录CAS原理理解通过Java代码测试CAS原理理解CAS算法,全名叫CompareAndSwap ,即:比较与交换。接下来采取多个线程同时操作同一个共享变量逻辑图的方式,说明什么是CAS。1、假设此时的内存中,该共享变量的数据值为:except = 0。2、当多个线程对该共享变量进行数据变更时,会将共享变量的数据拷贝副本至自己的工作内存中。3、对指定的工作内存中的数据进行修改操作,假设线程一需要将数据修改成1,此时则绑定一个变量信息为refresh = 1;同理线程2则为refresh原创 2021-09-25 17:33:08 · 409 阅读 · 1 评论 -
IDEA——如何查看某个类的其他子类
1、选中类名,右键选择Diagrams。2、选择需要查看的父类,右键选择show Implementations。3、在弹出的所有子类中,ctrl + A选中所有回车即可。然后可以生成如下所示的图谱:原创 2021-09-25 15:08:27 · 6061 阅读 · 1 评论 -
JVM内置锁Synchronized和锁升级详解
文章目录前言测试无锁synchronized 同步Lock 同步synchronized发展史jdk 1.6之前jdk 1.6及以后前言Java本身是支持多线程操作的,以便于提升代码的执行效率。但是涉及到多线程,总会出现类似超买超卖等并发问题。多线程编程中,有可能出现多个线程同时访问(操作)同一个 共享、可变资源的情况。这个资源一般称之为临界资源。这种临界资源可能是:对象、变量、文件等等。由于线程执行过程是不可控的,需要采取同步机制来协同对对象可变状态的访问。Java针对让多线程环境下,共享原创 2021-09-09 18:28:33 · 397 阅读 · 1 评论 -
Java——volatile为什么不能保证原子性
文章目录前言测试案例前言在 java——volatile关键字 博客中,之前提到了volatile 保证数据及时可见性,但不保证原子性的问题。在 volatile保证及时可见性 博客中,也重点举例说明了为什么volatile能够保证及时的可见性问题。本篇博客重点说明:volatile 不保证 原子性 的原因。测试案例通过一段Java案例代码对其进行相关的说明:...原创 2021-08-31 15:59:53 · 2204 阅读 · 12 评论 -
缓存一致性协议(MESI)理解
文章目录原创 2021-08-26 18:06:14 · 1022 阅读 · 6 评论 -
Java程序是如何让CPU执行的?
文章目录前言前言原创 2021-08-24 16:59:00 · 1209 阅读 · 4 评论 -
volatile——指令重排的规则和内存屏障插入策略
文章目录前言JMM针对编译器制定的volatile重排序规则以第一规则做案例分析理解当第一个操作是普通读写什么是读?什么是写?关于第一步第二步JMM内存屏障插入策略代码案例分析参考资料前言前面博客中,重点说明了volatile的相关特性。比如:保证共享变量在其他线程中的及时可见性,不能保证原子性。以及包括计算机指令重排的优点和缺点,以及案例说明了指令重排出现的可能性等。但是,volatile读写和普通读写之间,指令重排的规则又是如何判断的?本篇博客将围绕这个技术点做相关说明。JMM针对编译器制定原创 2021-08-18 22:11:29 · 928 阅读 · 0 评论 -
volatile禁止重排优化
文章目录简介简介本篇博客重点说明并发编程三要素、volatile无法保证原子性、volatile保证可见性以及volatile禁止指令重排。原创 2021-08-16 22:39:15 · 632 阅读 · 1 评论 -
Java——并发编程三要素
文章目录前言三要素1、原子性2、可见性3、有序性as-if-serial语义参考资料前言在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。但这三种问题分别又是什么,接下来做一个解释说明。三要素1、原子性一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么全部不执行!【注】有点类似 事务!一个很经典的案例:A向B转账。当用户A向用户B转账时,必将执行两个步骤:1、A扣除钱2、B账户增加钱假设上述的案例中,不存在原子性,那么原创 2021-08-12 17:11:55 · 1673 阅读 · 0 评论 -
java——Java内存模型(JMM)扩充
文章目录前言简介前言简介原创 2021-08-11 15:40:10 · 196 阅读 · 0 评论 -
java——volatile保证及时可见性
文章目录简介为什么说是及时可见性总结简介如标题所示,本篇博客不表述过多知识点,只为了验证volatile能保证及时的可见性。为什么说是及时可见性为了解释上述的问题,先回顾之前的博客知识点。在volatile关键字(一)一文中,重点说明了为什么volatile能保证可见性。当volatile修饰的变量信息在其他线程中进行了变更,通过MESI缓存总线的嗅探机制,及时通知其他线程。其他线程将其数据信息进行失效操作,重新从内存中加载数据。这里说到了及时这个词!!再看下列几个例子:Test1.原创 2021-08-10 11:08:06 · 390 阅读 · 0 评论 -
java——volatile关键字(二)
一、前言上一篇博客,我们为了解决各个线程中数据的可见性问题,添加了volatile关键字,确保了线程二对全局参数的变更,能影响到线程一的操作。同时也一起分析了volatile实现的原理和MESI协议以及MESI协议原子性操作的流程。我们接下来一起加强对volatile关键字的理解。二、深入了解volatile并发编程的三大特性:《并发编程三大特性》1、可见性2、原子性3、有序性...原创 2019-11-26 17:45:52 · 329 阅读 · 0 评论 -
java——volatile关键字(一)
一、初识在我们日常的计算机处理数据时,都是cpu、主内存、缓存、高速缓存。不了解RAM的可以参考文章:RAM和ROM的区别为什么会有高速缓存这个说法?现在的cpu越来越贵,贵的不是材料,而是每一代的处理运算效率,这个效率的快慢,就在于cpu寄存器、cpu高速缓存的处理效率上,通俗而言,cpu的处理速率是远远高于主内存的处理速率的,为了防止cpu处理速率受限于主内存,所以在cpu和主内存...原创 2019-11-25 23:55:32 · 777 阅读 · 4 评论