java并发编程
文章平均质量分 64
啦啦啦~~~
webor2006
码农一个,记录个人成长的点滴~~
展开
-
Java精通并发-可重入读写锁的共享锁释放源码解析
前言:在上一次Java精通并发-可重入读写锁底层源码分析及思想探究咱们对于ReadWriteLock的lock()上锁的细节从源码的角度进行了详情分析:这次则来分析释放锁的底层源码:读锁释放锁的逻辑分析:ReentrantReadWriteLock.ReadLock.unlock():这里还是以可重入的读锁为例进行分析:从这代码大致也能猜到它里面的逻辑,就是释放锁,然后将读锁的计数器减1,跟上锁的逻辑刚好相反:而对于这个sync,简单的再来回顾一下,毕竟距离上原创 2021-11-17 13:28:55 · 605 阅读 · 0 评论 -
Java精通并发-可重入读写锁底层源码分析及思想探究
前言:在上一次Java精通并发-可重入读写锁对于AQS的实现分析咱们对于可重入的读写锁ReentrantReadWriteLock进行了初步的使用和了解,先来回忆一下上一次对于读写锁的使用代码:这次则会聚焦在ReentrantReadWriteLock它对于AQS的基本使用上,因为本质上ReentrantReadWriteLock的底层依然是借助于AQS的力量来完成了读写锁相关的功能,从源码的结构也能够看出来:读锁上锁的逻辑分析:其实也就是分析这块的逻辑:ReadWriteL原创 2021-08-25 17:34:33 · 208 阅读 · 0 评论 -
Java精通并发-可重入读写锁对于AQS的实现分析
前言:距离上一次Java精通并发-可重入锁对于AQS的实现源码分析java并发的学习又过去半年之久了,为了继续往下学习,还特意的温习了一下之前所记录的笔记 -----AQS,很快地就能回忆起当时学它时的各种细节,有了当年笔记的备忘,就能非常好地解决大脑不够用造成彻底断篇又得重头学习的尬镜,于我而言就是所谓的“好记性不如烂笔头”吧。言归正传,上一次学习了关于ReentrantLock它对于AQS的使用,而当时主要集中在了获取锁的角度上,回忆一下当时的一个DEMO代码:而整体获取锁的逻辑就是:当原创 2021-08-25 17:31:26 · 206 阅读 · 2 评论 -
Java精通并发-可重入锁对于AQS的实现源码分析
在上一次Java精通并发-AQS整体架构与设计原则剖析对于AQS进行了一个整体的认识,这次则通过一个具体的例子来进一步来了解AQS。从简单的示例开始:如标题所示,这里会用到可重入锁,而ReentrantLock就可以支持可重入锁,关于它的使用可以参考https://www.cnblogs.com/webor2006/p/11792954.html,这里再来重温一下它的使用,比较简单,但是简单的使用其背后是不简单的,而咱们重温它的目的而是剖析它的背后,直接贴出来:package com.java原创 2021-08-25 16:51:10 · 242 阅读 · 0 评论 -
Java精通并发-AQS整体架构与设计原则剖析
背景了解:继续学习Java并发,这次学习一个全新的并发组件----AbstractQueuedSynchronizer(抽象队列同步器),俗称AQS:它是一个抽象类,然后大致看一下它的具体实现类:是不是常见的一些类都是它的实现者,也可见它的重要性,大致瞅一眼它的实现源码行数:相当的复杂呀,然而从某种程度来说其实它又没那么的复杂:如果你理解了它背后原理,它要解决什么问题,在不同场景下不同的字段分别代表啥含义。而且在之前Java并发所学的很多内容在AQS中或多或少都有所体现,比如之前原创 2021-08-24 17:44:53 · 171 阅读 · 0 评论 -
Java精通并发-CompletableFuture示例剖析与源码解读
前言:在上一次Java精通并发-Future模式示例剖析与源码详解中学习了Future模式,但是呢它有一个最大的缺点就是调用get()方法来获取其任务的结果时会阻塞,回忆一下:而基于这一个缺点而言,很多的开源项目或者公司都提供了自己的一个解决方案来弥补Future的不足,使得任务执行时和结果获取时都不阻塞,但是随着jdk1.8的发布,对于Future的进一步增强也已经问世了,它就是本次咱们要来研究的CompletableFuture,瞅一下:了解CompletableFuture:先原创 2021-08-24 17:42:12 · 253 阅读 · 0 评论 -
Java精通并发-Future模式示例剖析与源码详解
前言:这次来学习一下关于Java并发当中非常重要的一个模式----修饰模式,这种模式或多或少都有所耳闻,这种模式是从JDK1.5开始引入到并发包中,它从本质上是用来解决的根本的问题在于可以让一个任务在异步执行,而任务执行完之后我们可以在未来的某一个时间点上去获取到这个任务执行的结果,不管这个任务是执行失败或成功,举一个粟子:比如我们要完成一件任务,正常情况是要等到这个任务执行完之后才能拿到任务执行的结果【单线程顺序执行逻辑】,而如果使用Future模式之后,则执行任务可以交由别的线程来执行,而我们可继续原创 2021-08-24 17:39:50 · 157 阅读 · 0 评论 -
Java精通并发-CAS底层实现与AtomicInteger源码剖析、关于CAS问题描述
CAS底层实现:在上一次https://www.cnblogs.com/webor2006/protected/p/12874390.html对于CAS进行了了解,先回忆一下关键要点:那学了它有啥用呢?当然是有用的,一个概念的提出总是有实践者对其进行应用的,该实践者就是Java并发包,它里面提供大量的原子操作的基础组件,比如:AtomicInteger、AtomicLong...,其实这些...原创 2020-06-08 10:54:00 · 136 阅读 · 0 评论 -
Java精通并发-CAS详解及透过字节码分析变量操作的原子性
CAS:背景:继续Java并发的学习,这次开启新知识的学习,如标题所示---CAS,要想理解它,得先从一些背景知识了解起。1、synchronized关键字与Lock等锁机制都是悲观锁:从字面意思来理解就是说线程在操作数据的时候是很悲观的,所谓这个“悲观”是指它认为一定会有其它的线程与我争抢,所以为了保证我操作数据的安全,“一定”是先上锁再来操作数据,避免其它线程干扰我。所以它的特点是无论做任何操作,首先都需要先上锁,接下来再去执行后续操作,从而确保了接下来的操作都是由当前这个线程来执行。2原创 2021-08-24 17:34:58 · 170 阅读 · 0 评论 -
Java精通并发-CyclicBarrier底层源码剖析与Condition的使用详解
CyclicBarrier.await()再论:在上一次Java精通并发-CyclicBarrier透彻分析与示例剖析学习了CyclicBarrier的用法,对于它的底层实现又是怎么样的呢?所以这次来更深层次的探究一下它,不过在正式分析它的底层源码之前,对于它的await()有个细节还是值得去探讨一下的,先来回忆一下上一次的代码:package com.javacurrency.test5;import java.util.Random;import java.util.concurrent原创 2021-08-24 17:31:07 · 182 阅读 · 0 评论 -
Java精通并发-CyclicBarrier透彻分析与示例剖析
在上一次Java精通并发-CountDownLatch使用场景与示例分析及底层源码解读已经学习了对于CountDownLatch的使用了,回忆一下它的使用场景:这次准备学习一个跟它很类似的,但是呢使用场景还是有一些区别的,它就是CyclicBarrier,它也是在面试中很容易就会跟CoutDownLatch一起被问的,所以接下来来看一下它的使用场景。CyclicBarrier使用场景:先来描述一下它的使用场景:有若干个线程,比如说有五个线程,需要它们都到达了某一个点之后才能开始一起执行,也就原创 2021-08-24 17:23:29 · 95 阅读 · 0 评论 -
Java精通并发-CountDownLatch使用场景与示例分析及底层源码解读
这次准备学习一个平常面试高频次会被提及的东东,属于线程之间的一种通信问题,这里先提一个问题:有两个线程,第一个线程需要等待第二个线程执行完所有的任务之后,第一个线程才能继续执行,那咱们可以使用线程中的哪个机制能实现呢?很显然利用Thread.join()方法,这是人人皆知的,但是还有一种场景是用Thread.join()解决不了的,具体啥场景,下面开始瞅一下,肯定是需要用到CoutDownLatch这个类来解决了。CoutDownLatch使用场景:先来看一个场景:启动了一个主服务,然后它下面会启动原创 2021-08-24 17:20:57 · 279 阅读 · 0 评论 -
Java精通并发-JMM与happen-before规则深入详解【纯理论】
在之前已经对于Java的volatile关键字的原理作用进行了一个比较详细的学习,这次则来更进一步的去了解关于它更多的理论细节,理论都会比较枯燥,但是有助于更好的去理解相关的知识点。JMM了解:JMM,全称为Java Memory Model,Java内存模型,它是属于Java语言规范的一个内容,在一个多核的场景下,某一个处理器对某一个变量进行了一个修改操作,这些修改肯定是能被其它处理器所探测获取到的,但是什么时候能获取到协程中是木有明确规定的。比如说是修改了立马就能获取到?还是说得等一段时间待缓存原创 2021-08-24 17:18:59 · 265 阅读 · 0 评论 -
Java精通并发-volatile与内存屏障的重要语义详细分析
在上一次https://www.cnblogs.com/webor2006/protected/p/12595201.html咱们已经对于volatile关键字的作用进行了一定的了解,这里回顾一下:上一次对于第一条作用进行了详细的解读了,接下来则来解读一下剩下的两条:防止指令重排序、实现变量的可见性。而这俩其实都是通过一种手段来实现的:内存屏障(memory barrier),所以要想搞清...原创 2020-03-30 14:41:00 · 91 阅读 · 0 评论 -
Java精通并发-volatile关键字作用与锁的关系深入详解
前言:关于java中的volatile关键字,是之前自己一直不太自信的一个知识点,平常我们可能在写单例时经常能看到:而不管是面试还是工作,对于彻底理解它意义是非常之大的,而要彻底理解这个关键字也不是非常容易的事,牵扯到的知识点还是很多的,所以接下来则透析这个关键字。volatile关键字作用:volatile英文的意思是"不稳定的", 它主要有三方面的作用:1、实现long/double类型变量的原子操作。2、防止指令重排序。【这是平常我们都有听说过的】3、实现变量的可见性原创 2021-08-24 17:09:30 · 567 阅读 · 0 评论 -
Java精通并发-通过Condition实现线程间通信实例剖析【下】
在上一次https://www.cnblogs.com/webor2006/p/12083720.html完成了Condition线程同步的实例,但是还木有对其运行流程进行分析,所以这次对它进行一个细致的分析,并且再对其代码做一些调整加深对其的印象,先回顾一下上次的代码:public class MyTest2 { public static void main(String[] a...原创 2019-12-23 16:27:00 · 80 阅读 · 0 评论 -
Java精通并发-通过Condition实现线程间通信实例剖析【中】
继续上一次https://www.cnblogs.com/webor2006/p/12076950.html的示例继续来往下实现,上一次对需要用到的成员变量进行了定义,回忆下:接下来则正式开启具体逻辑的实现,首先来实现生产方法,很显然对于这些操作同时间肯定只能有一个线程进行,所以上锁是肯定的,所以代码如下:接下来需要判断一下条件,如果数组元素已经满了,则需要等,其代码写法跟之前咱们用sy...原创 2019-12-23 14:48:00 · 81 阅读 · 0 评论 -
Java精通并发-通过Condition实现线程间通信实例剖析【上】
了解实例的实现细节:在上一次https://www.cnblogs.com/webor2006/p/11906700.html咱们对Condition这个类的方法进行了大致的解读,接下来则会通过一个非常完整的例子来加深对Condition类的使用,在正式撸码之前,先回忆一下在之前https://www.cnblogs.com/webor2006/p/11423023.html我们利用synch...原创 2019-12-21 14:59:00 · 83 阅读 · 0 评论 -
Java精通并发-Condition方法实现分析与讲解
在上两次已经对Condition这个类的javadoc进行了完整的解读,接下来则对它里面的方法进行一下纵览,并进行官方的解读,如下:下面一一来读一下各个方法的说明:await():上面这段说明已经道出了这个方法的核心作用,非常重要,继续来看一下这四种情况是哪四种?接下来是实现上的考量,简单看一下既可:awaitUninterruptibly():在了解了第一个await(...原创 2019-11-21 16:55:00 · 86 阅读 · 0 评论 -
Java精通并发-Condition编程模式详解与分析
继续上一次https://www.cnblogs.com/webor2006/p/11890688.html的Condition接口说明进行阅读:上面这个程序会在之后手动来实现一下,说实话这种写法在实际工作中用得不多,自己也完全写不出来,感受一下Lock、Condition的写法,其中Condition的调用一定是要在获取Lock()之后才能使用,看一下范例的写法:而对比一下咱们之前...原创 2019-11-20 19:22:00 · 88 阅读 · 0 评论 -
Java精通并发-Condition详解及相比于传统线程并发模式的改进
在上一次https://www.cnblogs.com/webor2006/p/11792954.html对于Lock的具体实现类ReentrantLock用了一个示例对它进行了一个简单的了解,而它其实里面有很多东东,不过得循序渐进一步步来,目前还不适合来从底层分析它,另外在上次对于Lock和syncronized对于同步的区别做了一个文字的总结,这里回顾一下,相当之重要:而对于Lock这个...原创 2019-11-19 17:08:00 · 94 阅读 · 0 评论 -
Java精通并发-Lock与synchronized关键字在底层的区别及实例分析
在上两次中已经将Lock这个接口的整个官方说明进行了阅读,这次来了解一下它的一个非常重要的实现类:啥叫“可重入”呢?其实是指一个线程已经拿到了锁,然后该线程还能再次获取这把锁,接下来在了解它之前先用一下该锁,如下:然后接一来线程分别来调用定义的两个方法,如下:下面来执行一下:也就是线程交替地在执行,很容易理解,那如果下面修改一下代码:那结果又是咋样呢?肯定会发生阻塞的情况,因...原创 2019-11-04 16:52:00 · 114 阅读 · 0 评论 -
Java精通并发-Lock锁方法原理详解
继续上一次https://www.cnblogs.com/webor2006/p/11756563.html的Lock文档说明进行阅读:以上就是对于Lock类中官方解读,下面再纵览一下它里面的方法:下面简单也来了解一下里面方法的作用:它有点类似于synchronized的效果,下面再来看另位一个方法:继续,这个方法在实际中就会用得比较频繁了,瞅一下:接下来继续看...原创 2019-11-04 15:03:00 · 109 阅读 · 0 评论 -
Java精通并发-Lock锁机制深入详解
从这次开始接触Java1.5推出的并发包中的东东,先看一下jdk中的并发包:接下来咱们则会集中对这些并发包中的核心进行深入了解,不光要学会怎么用这些并发包中的类,而且还得知道这些功能背后运行的原理, 所以手踏实地的一步步从基础开始展开对它的剖析,在JDK1.5之前要想对代码进行同步只有一个选择,利用syncronized关键字,但是在之后推出了一个全新的同步方式,那就是Lock锁,这个我们在...原创 2019-10-29 05:16:00 · 85 阅读 · 0 评论 -
Java精通并发-死锁检测与相关工具详解
关于死锁其实在之前https://www.cnblogs.com/webor2006/p/10659938.html的jvm学习中已经详细举过例子了,不过这里再来复习一下,另外是从并发这个专题领域的角度再来看下它,这里先来阐述一下相关的概念:死锁:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源,两个线程都无法继续执行。活锁:线程持续重试一个总是失败的操作,导致无法继续执...原创 2019-09-03 11:28:00 · 91 阅读 · 0 评论 -
Java精通并发-锁粗化与锁消除技术实例演示与分析
在上一次https://www.cnblogs.com/webor2006/p/11446473.html中对锁的升级进行了一个比较详细的理论化的学习,先回忆一下:编译器对于锁的优化措施:锁消除技术:接下来则会通过实例来分析一下JIT编译器优化的一些方式,先来看第一个例子:很简单的程序,然后反编译看一下它在字节码的表现:接下来则来修改一下程序:其实反编译的字节码的锁还是会...原创 2019-09-02 20:09:00 · 81 阅读 · 0 评论 -
Java精通并发-轻量级锁与重量级锁的变化深入详解
在上一次https://www.cnblogs.com/webor2006/p/11446129.html的理论的最后谈到了锁的演化,如下:下面具体来阐述一下:偏向锁:它是针对一个线程来说, 它的主要作用就是优化同一个线程多次获取一个锁的情况;如果一个synchronized方法被一个线程访问,那么这个方法所在的对象就会在其Mark Word中将偏向锁进行标记,同时还会有一个字段来存储该线...原创 2019-09-02 14:44:00 · 89 阅读 · 0 评论 -
Java精通并发-锁升级与偏向锁深入解析
对于synchronized关键字,我们在实际使用时可能经常听说用它是一个非常重的操作,其实这个“重”是要针对JDK的版本来说的,如今JDK已经到了12版本了,其实对这个关键字一直是存在偏见的,它底层也发生了很多的变化,所以我们也得随着JDK的版本将知识进行更新才行,所以这节继续针对锁进行深入的探讨。在JDK 1.5之前,我们若想实现线程同步,只能通过synchronized关键字这一种方式来...原创 2019-09-02 13:59:00 · 78 阅读 · 0 评论 -
Java精通并发-透过openjdk源码分析wait与notify方法的本地实现
上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底层,对于wait()和notify()的底层细节到底是啥样的呢?下面还是先来到openjdk中来打开ObjectMonitor.hpp,其中它里面有一个很重要的类:然后我们要分析的wait()和...原创 2019-09-01 19:59:00 · 79 阅读 · 0 评论 -
Java精通并发-通过openjdk源码分析ObjectMonitor底层实现
在我们分析synchronized关键字底层信息时,其中谈到了Monitor对象,它是由C++来实现的,那,到底它长啥样呢?我们在编写同步代码时完全木有看到该对象的存在,所以这次打算真正来瞅一下它的真正面目,而对于这个Hospot代码JDK是并没有开源的,但是社区版本的JDK是开源了,在openjdk上可以阅读得到,所以下面先到openjdk上瞅一下:所以点击一下它:点击一下:然后...原创 2019-09-01 15:54:00 · 92 阅读 · 0 评论 -
Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】...
自旋对于synchronized关键字的底层意义与价值分析:对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述下:JVM中的同步是基于进入与退出监视器对象(Monitor,也叫管程对象)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和Java对象一同创建并销毁。Monitor对象...原创 2019-09-01 10:55:00 · 90 阅读 · 0 评论 -
Java精通并发-同步方法访问标志与synchronized关键字之间的关系
继续基于上一次https://www.cnblogs.com/webor2006/p/11428811.html来研究synchronized关键字在字节码中的表现,在上一次文末提出了一个这样的问题:其对应的源代码如下:这是因为上面这个同步块中的代码会有抛异常的情况发生,虽说我们肉眼看着好像只有一条打印语句,但是JVM需要考虑同步块抛异常的情况其锁也要正常被释放,所以我们可以看到有异常...原创 2019-08-31 14:39:00 · 79 阅读 · 0 评论 -
Java精通并发-透过字节码理解synchronized关键字
在上一次https://www.cnblogs.com/webor2006/p/11428408.html中对于synchronized关键字的作用做了一个实例详解,下面再来看一下这个程序:请问下,如果一个线程访问了同一个对象的method1()方法之后,另外一个线程能否访问同一个对角的method4的静态方法呢?答案是肯定的,因为method1的锁是锁的对象,而method4锁的是MyCl...原创 2019-08-29 11:39:00 · 106 阅读 · 0 评论 -
Java精通并发-synchronized关键字原理详解
关于synchronized关键字原理其实在当时JVM的学习【https://www.cnblogs.com/webor2006/p/9595300.html】中已经剖析过了,这里从研究并发专题的角度再来审视一下它,毕境对于并发它是非常之重要的,下面先来看一下程序:然后运行,其结果会不定的,有正常依次按顺序执行直到程序退出的,如下:也有不如预期的,如:写这个程序的目的其实并不是说同...原创 2019-08-29 10:51:00 · 86 阅读 · 0 评论 -
Java精通并发-多线程同步关系实例剖析与详解
在上一次https://www.cnblogs.com/webor2006/p/11422587.html中通过实践来解了一个案例,先来回顾一下习题:编写一个多线程程序,实现这样的一个目标:1、存在一个对象,该对象有一个int类型的成员变量counter,该成员变量的初始值为0。2、创建两个线程,其中一个线程对该对象的成员变量counter增1,另一个线程对该对象的成员变量减1。3、输...原创 2019-08-28 11:29:00 · 73 阅读 · 0 评论 -
Java精通并发-wait与notify及线程同步系统总结
notifyAll():在上两次中对于Object的wait()和notify()方法的官方doc进行了通读,上一次https://www.cnblogs.com/webor2006/p/11407966.html读了notify()的说明,接下来再来读一下notifyAll()方法的说明,先看下它的声明,也是native的:开始逐字解读:从上面描述可以看到,其实它跟notify(...原创 2019-08-28 09:56:00 · 80 阅读 · 0 评论 -
Java精通并发-wait与notify方法案例剖析与详解
在上一节中对Object的wait、notify、notifyAll方法进行了总结,这次举一个具体案例来进行巩固,题目如下:编写一个多线程程序,实现这样的一个目标:1、存在一个对象,该对象有一个int类型的成员变量counter,该成员变量的初始值为0。2、创建两个线程,其中一个线程对该对象的成员变量counter增1,另一个线程对该对象的成员变量减1。3、输出该对象成员变量count...原创 2019-08-28 10:35:00 · 94 阅读 · 0 评论 -
Java精通并发-notify方法详解及线程获取锁的方式分析
wait():在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数的重载方法,回忆下:其中如果传0代表无限等待,否则是等待指定的时间就会停止等待,如参数所示:这个版本的注释比无参的要详细很多,所以。。继续来解读它,不过它里面有一些上次看到无参wait()的...原创 2019-08-25 15:07:00 · 90 阅读 · 0 评论 -
Java精通并发-wait与sleep方法字节码分析
在上一次https://www.cnblogs.com/webor2006/p/11372521.html中对于Thread类和Runnable接口有了一个基本的认识,这次咱们继续巩固基础,首先先新建一个全新的工程,专门用来学习Java并发相关的:好,下面先来对Object中的wait()和Thread.sleep()方法进行官方说明解读:wait():打开Object类可以发现w...原创 2019-08-24 14:10:00 · 77 阅读 · 0 评论 -
Java精通并发-从Thread与Runnable说起
java并发的学习从去年就已经中断了,之前只对于java并发的一些基础进行了一些巩固,对于这个硬技能不管是对于面试还是对于日常的实际开发来说都非常之重要,所以接下来给自己重新定一个新目标,准备重拾它一步一个脚印从易到难彻底的将Java并发所涉及的方方面面进行一个深入的学习,向着“精通”的程度来努力,当然要想达到此目标肯定得把自己扒一层皮,不可能这么轻松的,所以贵在坚持!Thread:"万丈高...原创 2019-08-18 15:17:00 · 80 阅读 · 0 评论