多线程
Epoch-Elysian
just do it
展开
-
JAVA线程池源码深度解析
今天我们来说一说java编程中一个非常重要的工具:java线程池,顾名思义,线程池就是存放线程的池子。要使用线程的时候从池子里面拿出来,不用了再放回去。接下来我们将从源码的角度一步步分析java线程池的奥义。JAVA线程池先来看一下java线程池(ThreadPoolExecutor)大致的一个类图可以看到ThreadPoolExecutor的父接口有Executor和ExecutorService,其中ExecutorService是对Executor接口的扩展,AbstractExecu原创 2020-07-11 12:16:46 · 3461 阅读 · 1 评论 -
Java并发之BlockingQueue源码解析
首先来说BlockingQueue是什么?从字面上来看,BlockingQueue就是阻塞队列,它是一个先进先出且线程安全的队列。那么它什么时候发生阻塞?有两种情况:队列已满时进行入队操作,这个时候会阻塞,等待队列中的元素出队 队列为空时进行出队操作,这个时候也会阻塞,等待有元素入队BlockingQueue适用于生产者-消费者的场景。生产者不断地生产对象丢到BlockingQueue中(入队),直到BlockingQueue爆满。生产者线程会阻塞,等待消费者消费对象。而消费者不断地从Blockin原创 2020-07-04 15:21:55 · 271 阅读 · 0 评论 -
AQS之ReentrantReadWriteLock
本文对java并发包中ReentrantReadWriteLock进行源码分析,我们都知道ReentrantReadWriteLock就是读写锁,也是基于AQS来实现的,但是它拥有两种锁实例,读锁和写锁。其中写锁是独占锁,该锁同一时间被一个线程持有。而读锁是共享锁,可以被多个线程同时使用。ReentrantReadWriteLock在持有写锁的情况下,是可以获取读锁的。而持有读锁的情况下,是不允许获取写锁的,必须先释放掉读锁再获取写锁,否则会出现死锁情况。下面进入源码分析环节,先来看一看Reentr原创 2020-06-28 20:03:04 · 240 阅读 · 0 评论 -
AQS之Semaphore
目录acquirerelease总结从字面意思上来看,Semaphore 就是信号量的意思,可以用来做并发控制。其实我们可以把它理解成一个资源池,类似java的线程池。Semaphore是基于AQS的共享模式来实现的,所有线程共用同一个资源池。在构造方法中可以初始化资源的数量,例如new Semaphore(N),这里传入的N,其实就是将AQS中的state初始化为N,每个线程来了之后,通过acquire()方法获取到资源后,才能继续往下执行,获取资源其实就是对state进行-1 ,如果原创 2020-06-19 20:14:27 · 264 阅读 · 0 评论 -
AQS之CyclicBarrier
目录await总结上篇文章介绍了CountDownLatch,这篇文章重点介绍CyclicBarrier。上篇文章里说过,CountDownLatch是基于AQS的共享模式实现的,而CyclicBarrier其实是基于ReentrantLock和Condition来实现的。从名称上来看CyclicBarrier就是可循环的栅栏,如果我们把CountDownLatch当成一个计数器,那CyclicBarrier就是可重复利用的计数器,它拥有重置的功能,而CountDownLatch减到0就没了。原创 2020-06-19 00:16:19 · 237 阅读 · 0 评论 -
AQS之CountDownLatch
CountDownLatch是java并发包中一个常见的类,本文将从源码的角度来分析CountDownLatch的实现原理,而CountDownLatch是基于AQS的共享锁模式来实现的,所以需要对AQS有一定的了解。原创 2020-06-10 21:09:14 · 339 阅读 · 0 评论 -
volatile底层原理剖析
在理解volatile之前,我们先来熟悉下计算机执行程序的过程要执行我们的应用程序,首先将我们的程序从磁盘上读取到内存中,内存里这个时候存放了要执行的指令和数据,要执行一条指令的时候,指令寄存器根据程序计数器PC中存放的下一条待执行指令的地址,从内存中将指令取出来,cpu再根据指令内容将内存中的数据读取到数据寄存器中,ALU(算数逻辑单元)计算得出结果,将结果数据写回到内存。volat...原创 2020-04-25 00:28:27 · 386 阅读 · 0 评论 -
AQS之ReentrantLock
AQS是AbstractQueuedSynchronizer的简称,它是java并发包很重要的一个工具类,像比较常见的ReentrantLock、CountDownLatch等都是在AQS的基础上建立的。本文将从ReentrantLock的源码开始分析AbstractQueuedSynchronizer和ReentrantLock的工作原理。AbstractQueuedSynchronizer我们先来看下AbstractQueuedSynchronizer这个类里面都有些啥东西public a原创 2020-05-26 22:05:21 · 322 阅读 · 0 评论 -
AQS之Condition
本文重点介绍Condition的实现原理,Condition是基于ReentrantLok来实现的,要使用Condition必须先持有锁,所以Condition和ReentrantLock是配对使用的。Condition主要有两个方法await等待和signal唤醒,适用于生产者-消费者使用场景。下面是一个Condition的使用示例:Condition是通过ReentrantLock new出来的。老规矩,先来看下Condition的构造方法 public Condition n.原创 2020-06-05 21:19:13 · 425 阅读 · 0 评论 -
Synchronized笔记
CAScas(compare and swap)它指的是比较与交换,使用无锁的机制保证操作对象的原子性,说是无锁,其实它是一个自旋锁。首先读取当前值,在计算预期的结果值,在把值修改回去的时候,要比较一下原来读出来的值和现在的值是否相等,如果相等,说明没有别的线程改动过,更新为新的值。如果不一样则说明已经别的线程改过了,这个时候,再次读取当前值,重新再来一遍。cas的底层是由汇编指令lo...原创 2020-04-14 22:40:10 · 2788 阅读 · 6 评论