![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
文章平均质量分 85
7rulyL1ar
绵薄之力
展开
-
Java 创建线程的三种方式详解
Java实际创建线程流程,以及创建线程三种方式的详解及区别。原创 2022-06-05 20:54:46 · 259 阅读 · 1 评论 -
Java并发编程之CAS简析与ABA问题的解决方案
什么是CASCAS全称Compare And Swap,即比较并交换。CAS的功能是,先判断内存中的目标变量与给定期望值是否相同,如果相同,则为目标变量赋一个新值。CAS是乐观锁的一种实现,在锁竞争不大的情况下使用CAS实现同步的效率比悲观锁(synchronized等3)同步实现高,在Java并发包中具有广泛应用。Java中CAS的并发原语全部体现在sum.misc.Unsafe类中,Unsafe类中的方法均为native方法,在相对应的C语言的函数实现中,最终在C函数中调用汇编指令实现CAS操作。总原创 2022-02-14 12:01:57 · 693 阅读 · 0 评论 -
Java内存模型JMM与顺序一致性模型关于的对比与内存可见性讨论
**本文将主要围绕内存可见性展开讨论**,并横向对比其与顺序一致性内存模型的异同,探究Java内存模型在可见性问题上是如何规范的。其中在Java内存模型中内存可见性部分,主要涉及指令重排序相关的可见性问题,数据缓存相关的可见性问题不重点介绍。原创 2022-01-09 22:57:59 · 258 阅读 · 0 评论 -
Java双重检查锁定问题DCL
双重检查锁定双重检查锁定,即Double-Checked Lock问题,是并发编程中由于指令重排和不正确同步导致的经典并发问题延迟初始化在介绍本文重点双重检查锁定前,必须要先了解双重检查锁定问题是由何而来的。学习过Spring的同学一定都听过懒加载(lazy-init),延迟初始化与懒加载是同类型的思想,都是为了避免、推迟不必要的高性能开销操作或降低程序的启动时间。而本文要讨论的双重检查锁定就是为了延迟初始化服务的,详见下文。单线程环境下的延迟初始化在假定的单线程环境下,下列代码就可以很好的实现原创 2022-01-08 20:01:30 · 706 阅读 · 2 评论 -
Java并发编程之重入锁ReentrantLock源码解析
概述什么是重入锁重入锁ReentrantLock是显示锁的一种,是Lock接口最常见的实现,采取独占式资源获取方式,即一条线程持有资源锁时,其他线程必须阻塞直到线程释放锁,重入锁的特点是同一个线程可以多次获取锁。重入锁基于队列同步器AQS实现,同时支持Condition多条件队列(等待队列),在实现了AQS的基础上,提供了公平和非公平两种锁的获取方式。ReentrantLock源码解析成员变量与构造方法首先看一下ReentrantLock除了serialVersionUID以外唯一的成员变量:原创 2021-12-03 21:37:14 · 155 阅读 · 0 评论 -
Java并发编程之Condition接口与ConditionObject等待队列源码详解
Condition接口Condition接口能做什么Condition接口提供了类似java.lang.Object所提供的监视器方法,配合Lock接口可以实现等待/通知模式。首先援引一张《Java并发编程的艺术》之中的表格来展示二者的特点与异同。对比项Object监视器方法Condition前置条件获取对象的锁调用Lock.lock()获取锁调用Lock.newCondition()获取Condition对象调用方式直接调用如:object.wait()直接调用如原创 2021-12-01 13:34:15 · 521 阅读 · 0 评论 -
Java并发编程之LockSupport源码详解
什么是LockSupportLockSupport是JUC包下的一个工具类,主要作用是用于阻塞和唤醒线程,底层基于Unsafe类实现。LockSupport类的所有方法都被static修饰,可以在任意位置阻塞或唤醒某线程。JUC包下的队列同步器AQS的阻塞和唤醒操作就是使用LockSupport实现。接下来关注LockSupport的源码。LockSupport源码分析构造方法与成员变量LockSupport类只提供了一个被private修饰的构造方法,意味着LockSupport不能在任何地方被原创 2021-11-23 19:34:15 · 773 阅读 · 0 评论 -
Java并发编程之队列同步器AQS源码详解
什么是AQS简介队列同步器AbstractQueuedSynchronizer简称AQS,是用于实现阻塞锁和同步组件的基础框架,JUC中的同步工具类闭锁CountDownLatch、信号量Semaphore以及重入锁ReentrantLock和读写锁ReentrantReadWriteLock都是基于AQS实现(同步工具类栅栏CyclicBarrier虽与AQS没有直接关系,但其内含重入锁,与AQS脱不了干系)。AQS的作用AQS内部包含了一个volatile整型变量state和一个FIFO同步队列原创 2021-11-07 10:54:11 · 239 阅读 · 0 评论 -
Java并发编程之栅栏CyclicBarrier及源码详解
什么是栅栏Java中栅栏CyclicBarrier是一种同步机制,栅栏能够让一组线程到达一个同步点时被阻塞,直到这组线程中的最后一个线程到达同步点,所有被阻塞的线程才会被唤醒继续执行,即目的是只有某一组线程全部执行到同步点时,才继续执行,否则先到达同步点的线程将阻塞。栅栏CyclicBarrier与闭锁CountDownLatch的功能类似,分析过源码后会简要列举二者区别。栅栏实现思路CyclicBarrier类的构造函数会要求使用者为parties变量赋初值,parties变量表示一组线程的总数量原创 2021-11-04 01:46:17 · 930 阅读 · 0 评论 -
Java并发编程之信号量Semaphore详解及源码分析
什么是信号量信号量(Semphore)用于控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,以保证有限资源的合理使用。Semphore实现思路Semphore基于AQS队列同步器实现,他管理着一组虚拟许可(permit),许可通过Semphore的构造函数初始化。当程序执行指定操作前,需要先尝试获取许可,如果没有剩余许可,则当前线程进入阻塞状态,直到有许可位置。操作执行完毕后,将释放一个许可。当许可初始值设为1时,可以当作不可重入的互斥锁使用(通篇读过后不难理解)。Semphore原创 2021-10-29 01:06:09 · 385 阅读 · 0 评论 -
Java并发编程之闭锁CountDownLatch及源码分析
什么是闭锁闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态,可以用来确保某些活动直到其他活动都完成后才继续执行。适用场景如下确保某个计算在其需要的所有资源都被初始化之后才继续执行。确保某个服务在其依赖的所有其他服务都已经启动后才启动。确保等待某个操作的所有参与者都就绪后再继续执行。总之用于需要某个线程需要等待其他线程都做完某项工作才继续执行的场景。例如程序想让若干线程同时启动,如果在程序中对每个线程顺序调用start()方法,必然无法做到同时启动,此时可以利用闭锁实现,比如使用ja原创 2021-10-27 15:39:47 · 211 阅读 · 0 评论