并发编程
文章平均质量分 92
二码先生
做一个有灵魂的开发
展开
-
并发编程系列(十四)CAS详解与Unsafe类的应用
我们在前面的并发编程系列文章中,提到过CAS但是我们当时没有过多地进行解释,提到CAS我们首先应该理解一下JAVA中的乐观锁,乐观锁就是每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap(比较与交换)。什么是CASCAS,Compare and Swap(比较与交换)。我们都知道,在java语言之前,...原创 2020-03-07 17:27:33 · 193 阅读 · 0 评论 -
并发编程系列(十三)CyclicBarrier 栅栏-源码解析
从字面意思理解可以看出循环执行,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。循环是因为当等待线程都被释放后,CyclicBarrier对象可以被重用栅栏是强制要求线程到达某个临界点才能执行,当都到达时,一起跳过Cyclicbarrier对象执行。Cyclicbarrier类的属性 /** 对象入口的重如锁 */ private final ReentrantLoc...原创 2020-02-24 19:37:21 · 169 阅读 · 0 评论 -
并发编程系列(十二)CountDownLatch 闭锁-源码解析
CountDownLatch也叫做闭锁,是一种倒计时计数器。CountDownLatch等待多个线程都执行完成后,再继续做后面的事情。最常见的一个应用场景就是开启多个线程同时执行某个任务,等到所有任务都执行完在统计结果。CountDownLatch内部提供了一个计数器,在构造CountDownLatch时必须执行计数器的初始值,且计数器的初始值必须大于0。另外提供countDown()方法来操作计...原创 2020-02-24 16:02:13 · 150 阅读 · 0 评论 -
并发编程系列(十一)Semaphore信号量-源码解析
Semaphore底层是基于AbstractQeuedSynchronizer来实现的所以Semaphore的数据结构也是依托于AQS的数据结构1.1 Sync源码解析 /** * 内部类Sync继承自AQS */ abstract static class Sync extends AbstractQueuedSynchronizer { ...原创 2020-02-23 20:28:24 · 132 阅读 · 0 评论 -
并发编程系列(十)ReentrantLock 重入锁-源码解析
首先我们看一下ReentranLock的类图。我们从类图可以发现ReentranLock的子类Sync是继承AQS类的,前面我们对AQS的源码已经有了一些了解,那么我们一起来看一下ReentranLock的源码和AQS的关系具体是什么呢。我们可以看到ReentranLock实现Lock接口并且有Sync、NonfairSync和FairSync三个内部类的,并且NonfairSync和Fai...原创 2020-02-23 16:35:22 · 165 阅读 · 0 评论 -
并发编程系列(九)Synchronized的使用与实现原理(续)-锁升级与锁优化
通过 并发编程系列(四)Synchronized的使用与实现原理 我们已经介绍了Synchronized的加锁实现是通过monitor来实现的。但是我们知道monitor的实现是需要依赖操作系统完成。这极大地消耗了性能。因此在使用synchronized同步锁的时候需要进行用户态到内核态的切换。内核态CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。CPU也可以将自己从一个程序切换到...原创 2020-02-22 21:56:19 · 167 阅读 · 0 评论 -
并发编程系列(八)AQS同步器条件锁(Condition)加锁与解锁-源码分析
1.Condition接口在Lock接口中有一个newCondition方法;该方法将创建一个绑定在当前Lock对象上的Condition对象,说明Condition对象和Lock对象是对应的,一个Lock对象可以创建多个Condition对象,他们是一对多的关系。Condition接口的出现是为了扩展同步代码块中的wait/notify机制。通常情况下,我们调用wait()方法,主要是因为一...原创 2020-02-22 21:06:07 · 526 阅读 · 0 评论 -
并发编程系列(七)AQS同步器共享锁的加锁与解锁-源码分析
独占模式和共享模式的最大的不同就是在同一时刻能否有多个线程获取同步状态。独占模式:获取资源后,只有一个线程获取同步状态并执行共享模式:在获取资源后,多个线程共同执行我常用的Semaphore和CountDownLacth等都是共享锁。1.acquireShare() 方法源码解析此方法是共享模式下线程获取资源的顶层入口,获取成功则直接返回,失败则进入等待队列,并且自旋直到获取资源为止。...原创 2020-02-22 10:55:41 · 158 阅读 · 0 评论 -
并发编程系列(六)AQS同步器独占锁的加锁与解锁-源码分析
通过类图可以看到无论是我们常用的Semaphore还是ReentrantLock都是依赖AbstractQueuedSynchronizer实现的;AbstractOwnableSynchronizer是AbstractQueuedSynchronizer的父类为创建可能需要所有权概念的锁和相关同步器提供了基础。说道AQS我们不得不提到一个人,那就是 Doug Lea。俗话说,不识Doug ...原创 2020-02-21 22:04:17 · 229 阅读 · 0 评论 -
并发编程系列(五)ThreadLocal的应用与源码解析
ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间对一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。原创 2020-02-20 20:20:09 · 219 阅读 · 0 评论 -
并发编程系列(四)Synchronized的使用与实现原理
synchronized关键字使我们在多线程并发条件下经常使用的一个关键字,下面我们来详细介绍synchronized的应用场景及底层的实现原理。synchronized的使用分类被锁的对象伪代码实例方法类的实例对象public synchronized void method (){......}静态方法类对象public static synchroni...原创 2020-02-20 09:22:58 · 197 阅读 · 0 评论 -
并发编程系列(三)JMM内存模型及volatile底层实现原理详解
早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了...原创 2020-02-19 10:19:56 · 357 阅读 · 0 评论 -
并发编程系列(二)线程的中断
线程中断的概念java中线程中断是一种协作机制通过中断并不能直接终止线程的运作需要被中断的线程自己处理中断.每个线程都有一个boolean类型的标志位,代表线程是否中断;线程1想中断线程2,线程1只需要设置线程2的中断标识位等于true即可;线程2在合适的时候处理中断请求,甚至线程2可以选择不处理中断请求;结论:设置线程中断后,被中断的线程不是立即停止运行状态。线程中断的相关方法...原创 2020-02-18 17:23:19 · 240 阅读 · 0 评论 -
并发编程系列(一)线程的创建
多线程Java给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行内容。多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。进程: 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。...原创 2020-02-18 17:09:59 · 222 阅读 · 0 评论