并发编程
文章平均质量分 94
黄智霖-blog
骨灰级技术爱好者
展开
-
Java并发编程(二十):FutureTask源码分析
使用 FutureTask<String> futureTask = new FutureTask(() -> "success"); new Thread(futureTask).start(); futureTask.get();源码分析FutureTask提供了两个构造方法,分别是传入一个Callable,和传入一个Runnable和返回值result。如果传入的是Runnable和返回值,那么会通过适配器RunnableAdap原创 2021-05-11 01:07:16 · 2716 阅读 · 1 评论 -
Java并发编程(十九):ScheduledThreadPoolExecutor总结与源码分析
目录前言使用源码分析前言 ScheduledThreadPoolExecutor主要用于处理延时任务或者定时任务,在平时的工作场景中也有被广泛应用,而我们有了前文关于ThreadPoolExecutor源码的深入理解,这里理解ScheduledThreadPoolExecutor便会顺畅不少。使用ScheduledThreadPoolExecutor的使用还是比较简单,总体来说主要有三种方式提交任务:schedule:scheduleAtFixedRate:scheduleWithFixe原创 2021-05-09 00:56:59 · 8322 阅读 · 12 评论 -
Java并发编程(十八):ThreadPoolExecutor总结与源码深度分析
前言JUC中包含了很多的工具类,不论是第三方工具包,还是自己开发的业务系统,使用最多的还是是线程池,比如普通的线程池ThreadPoolExecutor、带调度的线程池ScheduledThreadPoolExecutor等,本文就从源码层面探究一下ThreadPoolExecutor的实现原理~注:研究线程池源码的目的是为了让自己能够对其有个清晰的认识,理解各个参数设置的含义,以帮助我们正确合理的使用线程池,除非时间非常充足,否则不建议去逐行研究其中的源码,本文也只是分析其核心逻辑的源码~总览原创 2021-04-28 23:01:19 · 3779 阅读 · 9 评论 -
Java并发编程(十六):CyclicBarrier源码分析
CyclicBarrier可以建立一个屏障,这个屏障可以阻塞一个线程直到指定的所有线程都达到屏障。就像团队聚餐,等所有人都到齐了再一起动筷子。根据Cyclic就可以发现CyclicBarrier可以重复使用。现在有了前面分析ReentrantLock、Semaphore、CountDownLatch的经验,CyclicBarrier也不复杂了,只是这里又引入新的概念:Condition条件队列,这也是最开始我们分析AQS没有讲的东西。原创 2021-04-21 00:23:33 · 4606 阅读 · 6 评论 -
Java并发编程(十五):CountDownLatch源码逐行深度分析
前言CountDownLatch维护了一个计数器(还是是state字段),调用countcountDown方法会将计数器减1,调用await方法会阻塞线程直到计数器变为0。可以用于实现一个线程等待所有子线程任务完成之后再继续执行的逻辑,也可以实现类似CyclicBarrier的功能,达到让多个线程等待同时开始执行某一段逻辑目的。有了前面Semaphore源码分析和ReentrantLock源码分析的基础,再来看CountDownLatch的源码就简单的多了。使用一个线程等待其它线程执行完再继续执行原创 2021-04-18 18:57:26 · 4252 阅读 · 7 评论 -
Java并发编程(十四):Semaphore源码逐行深度分析
使用Semaphore即信号量,可以控制并发访问特定的资源的线程的数量,比如可用于接口请求限流,和ReentrantLock一样依赖AQS实现,使用的话比较简单:Semaphore semaphore = new Semaphore(10);thread-0:semaphore.acquire();//do somethis......semaphore.release();thread-1:semaphore.acquire();//do somethis......semaphor原创 2021-04-14 21:18:03 · 4634 阅读 · 5 评论 -
Java并发编程(十二):ReentrantLock-FairSync源码分析(hasQueuedPredecessors)
前言有了前面ReentrantLock-NonfairSync源码逐行深度分析的基础,理解公平锁FairSync的实现就很简单了。ReentrantLock的默认构造函数创建的是非公平锁,同时提供了布尔类型的有参构造函数,true表示创建公平锁。public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new No原创 2021-04-08 22:23:29 · 4507 阅读 · 1 评论 -
Java并发编程(十一):ReentrantLock-NonfairSync源码逐行深度分析(下)
前言前面ReentrantLock-NonfairSync源码逐行深度分析(上)和ReentrantLock-NonfairSync源码逐行深度分析(中)两文从源码层面深度分析了NonfairSync的逻辑,有了前面的基础,我们就算是向AQS迈出了第一步,本文针对前面两篇文章做一个系统总结,后面就继续分析依赖AQS的其它工具类。ReentrantLock关键点AQS是抽象类AbstractQueuedSynchronizer的缩写,ReentrantLock中定义了静态内部类Sync继承自AQS,并原创 2021-04-08 13:24:46 · 5254 阅读 · 7 评论 -
Java并发编程(十):ReentrantLock-NonfairSync源码逐行深度分析(中)
,同样在AQS中找到该方法的实现:final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { //标识是否被中断 boolean interrupted = false; //死循环 for (;;) { //获取node节点的前驱节点原创 2021-04-07 23:57:09 · 6170 阅读 · 7 评论 -
Java并发编程(九):ReentrantLock-NonfairSync源码逐行深度分析(上)
CAS 修改state加锁自旋加锁park阻塞线程队列保存阻塞的线程:双向链表实现队列,为了防止每次判空,会有一个空的头结点。CAS保证入队必须成功unpark或interrupt唤醒原创 2021-04-05 01:18:04 · 3749 阅读 · 4 评论 -
Java并发编程(九):深入OpenJDK源码全面理解 Synchronized
该文章内容较多,发布在gitchat,涉及内容主要包括:一、用法总结 二、类加载器对 class 锁的影响 三、线程的实现 四、基于 monitor 实现的重量级锁 4.1 monitor 4.2 对象内存布局 4.3 monitor 的 C++ 源码实现概览 五、锁优化 5.1 自旋锁 5.2 逃逸分析与锁消除 5.3 锁粗化 5.4 CAS 与轻量级锁...原创 2019-09-20 22:49:40 · 28486 阅读 · 13 评论 -
Java并发编程(八):volatile使用和原理详解
一、背景大家都知道volatile作为一个“轻量级”的关键字,它能够保证可见性、有序性,但是不能保证原子性。那么它到底是怎么保证可见性和有序性的呢?为什么不能保证原子性呢?我们该如何正确使用volatile呢?下面我们一一进行解释。二、volatile之可见性对于可见性,我们在前面的博文已经介绍过了,这里直接出一个实际的例子:public class Test { pub...原创 2019-05-11 00:49:54 · 27706 阅读 · 0 评论 -
Java并发编程(六):从CPU缓存一致性协议到JMM(Java内存模型)
注:本系列主要注重并发编程这块儿,JVM内容很多,会另外开专栏总结,此系列可能只是会稍微提及一、跨平台和JVM经过前面几篇博文的介绍,我们知道,任何编程语言编写的程序要想被计算机执行,都必须被翻译成运行环境的CPU所能识别的一系列指令。这就导致了一个现象:通常情况下,我们的程序被编译后,只能在对应系列的CPU架构上运行。如果想要在其它不同架构的CPU上运行,则需要根据对应的CPU指令集重新...原创 2019-04-07 15:53:10 · 51712 阅读 · 4 评论 -
Java并发编程(七):原子性、可见性、有序性与happens-before
一、三大特性1.1 原子性原子是化学反应中不可再分的基本微粒,其在化学反应中不可分割。在计算机中,它表示的是一个操作,可能包含一个或多个步骤,这些步骤要么全部执行成功要么全部执行失败,并且执行的过程中不能被其它操作打断,这类似于数据库中事务的原子性概念。前文提到的:i = i + 1,就是一个非原子操作,它涉及到获取i,获取1,相加,赋值等4个操作,所以在多线程情况下可能会出现并发问题...原创 2019-05-04 21:47:54 · 15970 阅读 · 1 评论 -
redis实现简易分布式锁
一、依赖命令SET key value [EX seconds] [PX milliseconds] [NX|XX]注:这是redis后面版本扩展了set指令(可以替代setnx、setex等),也就是简单的将set key value扩展了几个参数,并且保证原子操作二、解释key:字面意思value:字面意思EX/PX:用于支持设置key的过期时间,这两个参数表示单位,E...原创 2019-03-20 19:28:42 · 45264 阅读 · 1 评论