Java并发编程
文章平均质量分 92
从计算机原理到JVM再到并发,从原理级别理解Java多线程模块,并且总结一些自己在使用过程中的经验教训
黄智霖-blog
骨灰级技术爱好者
展开
-
Java并发编程(十七):Atomic、LongAdder等总结
一、前言JUC是java.util.concurrent包的简称,该包中提供了Java并发编程中常用的工具类,从Java5.0开始提供。像我们前面总结的volatile和synchronized关键字,虽然使用起来很方便,但是从功能来说较为简单,很多并发需求它们并不能够直接满足。而通过JUC,我们能很方便地实现更加复杂的并发控制逻辑。从这边博文开始,我们会对整个JUC进行全面的总结,每一个工具...原创 2021-04-27 01:28:20 · 3845 阅读 · 0 评论 -
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 · 2743 阅读 · 1 评论 -
Java并发编程(十九):ScheduledThreadPoolExecutor总结与源码分析
目录前言使用源码分析前言 ScheduledThreadPoolExecutor主要用于处理延时任务或者定时任务,在平时的工作场景中也有被广泛应用,而我们有了前文关于ThreadPoolExecutor源码的深入理解,这里理解ScheduledThreadPoolExecutor便会顺畅不少。使用ScheduledThreadPoolExecutor的使用还是比较简单,总体来说主要有三种方式提交任务:schedule:scheduleAtFixedRate:scheduleWithFixe原创 2021-05-09 00:56:59 · 8339 阅读 · 12 评论 -
Java并发编程(十八):ThreadPoolExecutor总结与源码深度分析
前言JUC中包含了很多的工具类,不论是第三方工具包,还是自己开发的业务系统,使用最多的还是是线程池,比如普通的线程池ThreadPoolExecutor、带调度的线程池ScheduledThreadPoolExecutor等,本文就从源码层面探究一下ThreadPoolExecutor的实现原理~注:研究线程池源码的目的是为了让自己能够对其有个清晰的认识,理解各个参数设置的含义,以帮助我们正确合理的使用线程池,除非时间非常充足,否则不建议去逐行研究其中的源码,本文也只是分析其核心逻辑的源码~总览原创 2021-04-28 23:01:19 · 3785 阅读 · 9 评论 -
Java并发编程(十六):CyclicBarrier源码分析
CyclicBarrier可以建立一个屏障,这个屏障可以阻塞一个线程直到指定的所有线程都达到屏障。就像团队聚餐,等所有人都到齐了再一起动筷子。根据Cyclic就可以发现CyclicBarrier可以重复使用。现在有了前面分析ReentrantLock、Semaphore、CountDownLatch的经验,CyclicBarrier也不复杂了,只是这里又引入新的概念:Condition条件队列,这也是最开始我们分析AQS没有讲的东西。原创 2021-04-21 00:23:33 · 4613 阅读 · 6 评论 -
Java并发编程(十五):CountDownLatch源码逐行深度分析
前言CountDownLatch维护了一个计数器(还是是state字段),调用countcountDown方法会将计数器减1,调用await方法会阻塞线程直到计数器变为0。可以用于实现一个线程等待所有子线程任务完成之后再继续执行的逻辑,也可以实现类似CyclicBarrier的功能,达到让多个线程等待同时开始执行某一段逻辑目的。有了前面Semaphore源码分析和ReentrantLock源码分析的基础,再来看CountDownLatch的源码就简单的多了。使用一个线程等待其它线程执行完再继续执行原创 2021-04-18 18:57:26 · 4258 阅读 · 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 · 4640 阅读 · 5 评论 -
Java并发编程(十三):ReentrantLock-tryLock(long timeout, TimeUnit unit)源码分析
在前文ReentrantLock-NonfairSync源码逐行深度分析中,已经分析了AQS加解锁,阻塞唤醒与CLH队列的使用,这里主要看看带超时时间的tryLock实现。在ReentrantLock的tryLock(timeout)方法中调用的是sync的tryAcquireNanos:public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { return原创 2021-04-12 22:02:20 · 1970 阅读 · 0 评论 -
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 · 4515 阅读 · 1 评论 -
Java并发编程(十一):ReentrantLock-NonfairSync源码逐行深度分析(下)
前言前面ReentrantLock-NonfairSync源码逐行深度分析(上)和ReentrantLock-NonfairSync源码逐行深度分析(中)两文从源码层面深度分析了NonfairSync的逻辑,有了前面的基础,我们就算是向AQS迈出了第一步,本文针对前面两篇文章做一个系统总结,后面就继续分析依赖AQS的其它工具类。ReentrantLock关键点AQS是抽象类AbstractQueuedSynchronizer的缩写,ReentrantLock中定义了静态内部类Sync继承自AQS,并原创 2021-04-08 13:24:46 · 5260 阅读 · 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 · 6177 阅读 · 7 评论 -
Java并发编程(九):ReentrantLock-NonfairSync源码逐行深度分析(上)
CAS 修改state加锁自旋加锁park阻塞线程队列保存阻塞的线程:双向链表实现队列,为了防止每次判空,会有一个空的头结点。CAS保证入队必须成功unpark或interrupt唤醒原创 2021-04-05 01:18:04 · 3757 阅读 · 4 评论 -
关于类加载的并发控制锁(ClassLoadingLock)
死锁在JDK1.7以前,java.lang.ClassLoader的一些核心方法是被synchronized修饰的,比如loadClass,以下摘自JDK6下java.lang.ClassLoader的部分方法:protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {...}private synchronized Class loa原创 2021-03-16 13:18:58 · 12361 阅读 · 15 评论 -
Java并发编程(八):volatile使用和原理详解
一、背景大家都知道volatile作为一个“轻量级”的关键字,它能够保证可见性、有序性,但是不能保证原子性。那么它到底是怎么保证可见性和有序性的呢?为什么不能保证原子性呢?我们该如何正确使用volatile呢?下面我们一一进行解释。二、volatile之可见性对于可见性,我们在前面的博文已经介绍过了,这里直接出一个实际的例子:public class Test { pub...原创 2019-05-11 00:49:54 · 27718 阅读 · 0 评论 -
Java并发编程(七):原子性、可见性、有序性与happens-before
一、三大特性1.1 原子性原子是化学反应中不可再分的基本微粒,其在化学反应中不可分割。在计算机中,它表示的是一个操作,可能包含一个或多个步骤,这些步骤要么全部执行成功要么全部执行失败,并且执行的过程中不能被其它操作打断,这类似于数据库中事务的原子性概念。前文提到的:i = i + 1,就是一个非原子操作,它涉及到获取i,获取1,相加,赋值等4个操作,所以在多线程情况下可能会出现并发问题...原创 2019-05-04 21:47:54 · 15980 阅读 · 1 评论 -
Java并发编程(六):从CPU缓存一致性协议到JMM(Java内存模型)
注:本系列主要注重并发编程这块儿,JVM内容很多,会另外开专栏总结,此系列可能只是会稍微提及一、跨平台和JVM经过前面几篇博文的介绍,我们知道,任何编程语言编写的程序要想被计算机执行,都必须被翻译成运行环境的CPU所能识别的一系列指令。这就导致了一个现象:通常情况下,我们的程序被编译后,只能在对应系列的CPU架构上运行。如果想要在其它不同架构的CPU上运行,则需要根据对应的CPU指令集重新...原创 2019-04-07 15:53:10 · 51723 阅读 · 4 评论 -
Java并发编程(五):计算机基础-机器语言、高级语言和操作系统
一、机器语言和汇编语言在开始之前,我们先回想一下之前了解到的CPU(戳这里查看详情)。CPU靠指令来做各种运算,每个CPU都有一些自己能够直接识别的指令,我们称之为CPU的"指令集",或者叫做机器语言(机器码)。我们也提到过了,这些指令集其实都是一些0101的二进制组合,计算机会将它们转换为一系列高低电平的电信号,配合我们前面了解的继电器、门电路等完成对硬件的控制。而不同的CPU结构,即使...原创 2019-03-24 16:15:11 · 16225 阅读 · 0 评论 -
Java并发编程(四):计算机基础-门电路与加法器
一、门电路用以实现基本逻辑运算和复合逻辑运算的单元电路称为门电路。上一部分我们已经知道了逻辑门电路的概念(逻辑运算、继电器和门电路),并且引出了一个基础的门电路:与门事实上,常用的门电路有很多,除了我们之前介绍的与门,还有或门、非门、与非门、或非门等等,我们的目的是简单介绍门电路在计算机中的应用,现在不用探究的太深刻,如果感兴趣的同学可以自行查阅相关资料(推荐书籍<<编码的...原创 2019-03-17 20:20:21 · 10103 阅读 · 2 评论 -
Java并发编程(三):计算机基础-逻辑运算、继电器和门电路
前面介绍了CPU制造工艺和CPU工作流程,现在我们来了解一下其逻辑基础(本章内容部分参考自书籍:<<编码的奥秘>>)(之前有写过一篇介绍二进制的文章:二进制:基础、正负数表示、存储与运算)一、介绍我们现在知道,在计算机内部,不论是数据还是地址都是一系列0和1的组合,那么计算机是通过何种方式"认识"0和1的呢?又是怎么将这些0和1运用起来执行各种运算操作的呢?CP...原创 2019-03-17 17:24:08 · 10152 阅读 · 0 评论 -
Java并发编程(二):计算机基础-CPU工作流程
前一部分我们大致介绍了CPU的制造工艺,这里主要简单介绍其结构和工作流程。一、简介我们知道,CPU是"焊"在主板上的,如果你把CPU翻转过来,可以发现其下面有很多针脚,而不同的针脚数可能对应不同的接口类型,CPU通过这些针脚和主板相连,通过它们发出和接受信息,就是控制我们通常所说的总线。主板连接了计算机上的其它部件,这样通过这种方式,就将它们连接成了一个整体。二、工作流程大体上,C...原创 2019-03-17 15:09:46 · 18907 阅读 · 1 评论 -
Java并发编程(一):计算机基础-CPU制造
这系列旨在总结java并发编程中的一些原理、工具、技巧和一些注意事项等,在开始Java的部分之前,会先花一些篇幅总结计算机的一些基础,别是CPU和内存部分,以帮助后面理解一些原理性的东西。一、简述计算机从上个世纪被发明后,由第一代的电子管计算机时代到现在的大规模集成电路,体积是越来越小,性能则是越来越强悍。我们都知道,计算机系统的硬件结构主要由几部分组成:控制器、运算器、存储器和输入、输出...原创 2019-03-17 00:30:11 · 9581 阅读 · 1 评论