
Java 并发
文章平均质量分 95
Java 的广阔世界任你探索,有无尽的可能
小鱼人爱编程
源码面前无秘密,全栈[后端(Java、Node.js、Go)、前端(Vue、React)、移动端(Android(Kotlin、Java)、iOS(Swift)、跨端(RN、Flutter、KMP)、HarmonyOS(ArkTS)]知识持续输出中...
github:https://github.com/fishforest
展开
-
Java 线程池之必懂应用-原理篇(下)
前言上篇文章分析了线程池的运行原理,本篇将重点分析如何使用线程池、线程池一些常用的API的使用。通过本篇文章,你将了解到:1、线程池的状态2、线程池常用API3、开启线程池的几种方式4、如何关闭/停止线程池5、线程池返回值1、线程池的状态线程池有五种状态,分别为: // runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BIT原创 2021-09-25 11:58:46 · 656 阅读 · 0 评论 -
Java 线程池之必懂应用-原理篇(上)
前言Java 线程池是面试、工作必须掌握的基础之一,使用线程池能够更好地规划应用CPU占用率,提高应用运行的流畅度,本篇将来探索线程池的应用与原理。通过本篇文章,你将了解到:1、为什么需要线程池2、自己实现简单线程池3、线程池原理4、总结1、为什么需要线程池名词由来池,顾名思义:就是装一堆东西的地方。当有需要的时候,从池子里拿东西,当不用的时候,就往池子里放。可以看出存放、取用都很方便。线程池类比咱们在打疫苗的时候,若是啥时候想打啥时候过去,到了医院,医生需要换上防护服,戴上手套,原创 2021-09-23 13:10:47 · 429 阅读 · 0 评论 -
Java 线程池之线程返回值
前言通常来说,开启线程能够提高程序的并发能力,而Thread 类里并没有任何方法可以获取到线程的执行结果。接下来,我们将一步步分析如何拿到线程的执行结果。通过本篇文章,你将了解到:1、原始方式 获取线程执行结果2、FutureTask 获取线程执行结果3、线程池 获取线程执行结果1、原始方式 获取线程执行结果public class ThreadRet { private int sum = 0; public static void main(String args[]原创 2021-09-22 13:12:30 · 5968 阅读 · 0 评论 -
最详细的图文解析Java各种锁(终极篇)
前言前面的十几篇文章都是从源码的角度分析线程并发涉及到的知识点,本篇将重点总结、归纳、提炼知识点,尽量少贴代码。遇到有疑惑的点,请查看对应文章的分析。通过本篇文章,你将了解到:1、锁的全家福2、如何验证公平/非公平锁3、底层如何获取锁/释放锁4、自旋锁与自适应自旋5、为什么需要等待/通知机制1、锁的全家福2、如何验证公平/非公平锁公平与非公平区别之处在于获取锁时的策略。如上图:1、线程1持有锁。2、线程2、线程3、线程4 在同步队列里排队等候锁。这时线程5也想要获取锁原创 2021-09-19 15:04:48 · 1034 阅读 · 0 评论 -
Java Semaphore/CountDownLatch/CyclicBarrier 深入解析(应用篇)
前言上篇文章分析了Semaphore/CountDownLatch/CyclicBarrier 实现原理,这次从应用的角度探索三者适用场合及其使用方式。通过本篇文章,你将了解到:1、场景引入2、Semaphore 适用场景及使用方式3、CountDownLatch 适用场景及使用方式4、CyclicBarrier 适用场景及使用方式5、三者适用场景总结1、场景引入网上很多文章在讲解这几个类的时候,分别举例讲解不同场景下的应用,这些例子本身没有紧密关联,不好横向对比。因此,此处我们先预原创 2021-09-19 14:59:44 · 473 阅读 · 0 评论 -
Java Semaphore/CountDownLatch/CyclicBarrier 深入解析(原理篇)
前言前面分析了基于AQS的独占锁ReentrantLock、共享锁/独占锁ReentrantReadWriteLock,它们内部都实现了Lock 接口。而AQS还有其它常用的子类封装器,它们虽然没有实现Lock接口,但可以用来做线程间的同步,接下来将要来深入了解它们。通过本篇文章,你将了解到:1、Semaphore 原理分析2、CountDownLatch 原理分析3、CyclicBarrier 原理分析1、Semaphore 原理分析场景引入ReentrantReadWriteLock原创 2021-09-19 14:53:39 · 502 阅读 · 0 评论 -
Java 并发之 ReentrantReadWriteLock 深入分析
前言上篇文章分析了AQS的实际应用之一:ReentrantLock 的实现。ReentrantLock 和synchronized 都是独占锁,而AQS还支持共享锁,本篇就来分析AQS 共享锁的实际应用。通过本篇文章,你将了解到:1、共享锁、独享锁区别2、读锁的实现原理3、写锁的实现原理4、读写锁 tryLock 原理5、读写锁的应用1、共享锁、独享锁区别基本差别共享锁、独占锁是在AQS里实现的,核心是"state"的值:如上图,对于共享锁来说,允许多个线程对state进行有效修原创 2021-09-19 14:49:09 · 858 阅读 · 0 评论 -
Java 并发之 ReentrantLock 深入分析(与Synchronized区别)
前言前面两篇文章分析了AQS实现的核心功能,如独占锁、共享锁、可中断锁,条件等待等。而AQS是抽象类,需要子类实现,接下来几篇将重点分析这些子类实现的功能,常见的封装AQS子类的类如下:注:以上这些类并不是直接继承自AQS,而是内部持有AQS的子类实例,通过AQS的子类实现具体的功能通过本篇文章,你将了解到:1、ReentrantLock 实现非公平锁2、ReentrantLock 实现公平锁3、ReentrantLock 实现可中断锁4、ReentrantLock tryLock 原理原创 2021-09-19 14:42:11 · 781 阅读 · 0 评论 -
Java Thread.sleep/Thread.join/Thread.yield/Object.wait/Condition.await 详解
前言前面几篇文章深入分析了Thread、synchronized、AQS等相关知识,基础打好了,接下来就来分析常见的几个方法的应用、原理及其容易混淆的地方。通过本篇文章,你将了解到:1、Thread.sleep 应用及原理2、Thread.yield 应用及原理3、Thread.join 应用及原理4、Object.wait 应用及原理5、Condition.await 应用及原理6、总结1、Thread.sleep 应用及原理Thread.sleep 应用Thread.sleep原创 2021-09-19 14:35:10 · 1144 阅读 · 0 评论 -
Java并发之 AQS 深入解析(下)
前言上篇分析了AQS实现共享/独占锁的实现细节以及一些疑难点,本篇继续分析AQS剩余部分知识。通过本篇文章,你将了解到:1、可/不可中断的独占锁2、可/不可中断共享锁3、可/不可限时等待的锁4、等待/通知的实现5、同步队列与等待队列的异同点6、Condition.await/Condition.signal 与Object.wait/Object.notify区别1、可/不可中断的独占锁可中断锁的定义打个小比喻:先说一种场景:小明是网瘾少年,整天在网吧里打游戏,妈妈打电话叫他原创 2021-09-18 13:06:38 · 787 阅读 · 0 评论 -
Java并发之 AQS 深入解析(上)
前言前面几篇分析了synchronized 原理及其使用,synchronized 是JVM实现的,核心代码是C++,对于不熟悉C++语言的读者可能有点难度。JUC 包下提供了新的同步框架:AQS,是纯JAVA代码实现的。如果你了解了synchronized 核心,那么AQS不在话下,若是不了解,本篇将一起从头到尾深入分析AQS。通过本篇文章,你将了解到:1、如何实现自己的同步框架2、AQS 功能解析3、AQS 独占锁实现4、AQS 共享锁实现5、场景模拟与疑难解答1、如何实现自己的同步原创 2021-09-17 13:18:24 · 1165 阅读 · 9 评论 -
Java Synchronized 重量级锁原理深入剖析下(同步篇)
前言上篇分析了重量级锁在线程互斥场景下加锁、释放锁的过程,本篇将分析重量级锁在线程同步下的等待、通知机制。通过本篇文章,你将了解到:1、为什么 wait/notify/notifyAll 需要上锁2、wait/notify/notifyAll 源码入口3、Object.wait(xx) 流程解析4、Object.notify()/Object.notifyAll() 流程解析5、wait/notify/notifyAll 流程图6、线程互斥同步下 锁的流程图7、wait/notify/n原创 2021-09-16 13:08:18 · 774 阅读 · 0 评论 -
Java Synchronized 重量级锁原理深入剖析上(互斥篇)
前言上篇文章分析了偏向锁、轻量级锁的演变过程,本篇将分析重头戏:重量级锁的原理。通过本篇文章,你将了解到:1、ObjectMonitor 的运用2、锁的膨胀过程3、重量级锁的加锁流程4、重量级锁的解锁流程5、重量级锁小结6、与偏向锁、轻量级锁的比对1、ObjectMonitor 的运用我们知道当锁处在轻量级锁的状态时,Mark Word 存放着指向Lock Record指针,Lock Record是线程私有的。而处在重量级锁状态时说明有线程没拿到锁需要阻塞等待锁,当拥有锁的线程释放原创 2021-09-15 13:08:32 · 2213 阅读 · 2 评论 -
Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程
前言上篇文章已经分析了Java对象头构成、源码及其对象头的调试,本篇将分析偏向锁、轻量级锁、重量级锁的实现及其演变过程。由于涉及到c++源码,估计不少同学没兴趣看,因此重点多以图+源码辅助分析。通过本篇文章,你将了解到:1、什么是重量级锁2、轻量级锁/偏向锁的由来3、偏向锁的加锁、撤销锁、释放锁4、轻量级锁的加锁、释放锁5、偏向锁、轻量级锁、重量级锁的异同点1、什么是重量级锁简单例子 private synchronized void testLock() {原创 2021-09-14 13:15:22 · 7689 阅读 · 2 评论 -
Java 对象头分析与使用(Synchronized相关)
前言从上篇文章我们了解到:synchronized修饰代码块/修饰方法,最终都是在对象头上做文章,因此对象头是深入理解synchronized 各种锁变化的基础。接下来就来深入分析对象头在synchronized里的作用。通过本篇文章,你将了解到:1、对象在内存的构成2、对象头的构成3、对象头源码实现4、调试查看对象头1、对象在内存的构成先看一个简单的类: class Student { int age; String name; }原创 2021-09-13 13:05:15 · 852 阅读 · 0 评论 -
Java Synchronized实现互斥之应用与源码初探
前言上篇文章从无到有分析了如何实现"锁",虽然仅仅实现了最简单的锁,但"锁"的精华已经提取出来了,有了这些知识,本篇将分析系统提供的锁-synchronized关键字的使用与实现。通过本篇文章,你将了解到:1、synchronized 如何使用2、synchronized 源码初探3、总结1、synchronized 如何使用多线程访问临界区由上篇文章可知,多线程访问临界区需要锁:临界区可以是一段代码,也可以是某个方法。synchronized 各种使用方式按锁作用区域划分,可分原创 2021-09-12 23:50:53 · 607 阅读 · 0 评论 -
Java 并发“锁“的本质(一步步实现锁)
前言在上篇分析了CAS、线程挂起/唤醒相关知识后,常规的做法本篇就需要分析Synchronized与AQS的源码了。不过此次并不打算这样做,这么做就会陷入源码的枯燥讲解中,不了解前因后果,转折过于生硬。因此本篇先从实际需求一步步推导为什么需要"锁"?如何自己实现"锁"等步骤,最后才自然过渡到系统提供了哪些"锁"及其原理与应用。通过本篇文章,你将了解到:1、互斥访问变量2、CAS访问变量3、互斥访问临界区4、线程挂起/唤醒策略5、线程同步策略6、总结1、互斥访问变量先看一段代码:原创 2021-09-01 13:21:54 · 1006 阅读 · 0 评论 -
Java Unsafe/CAS/LockSupport 应用与原理
前言学过C/C++都应该对指针不陌生,指针指向了一个内存块,通过指针就可以轻易地修改内存。而Java已经没有指针这概念,取而代之的是引用,通过引用访问对象里的字段。实际上Java还是提供了操作内存的类,该类即是Unsafe。通过本篇文章,你将了解到:1、Unsafe 有哪些功能2、Unsafe 操作对象3、CAS 原理及应用4、LockSupport 挂起/唤醒 线程5、总结1、Unsafe 有哪些功能如何查看Unsafe 内容Unsafe.java 在sun.misc包下,并不是J原创 2021-08-31 13:06:56 · 1007 阅读 · 2 评论 -
Java ThreadLocal你之前了解的可能有误
前言在Android事件驱动Handler-Message-Looper解析中提到过ThreadLocal,由于篇幅限制没有展开来说,这次来一探究竟。通过这篇文章你将知道:1、为什么需要ThreadLocal2、ThreadLocal应用场景3、ThreadLocal和线程安全关系4、ThreadLocal原理解析5、ThreadLocal在Android源码里的运用6、ThreadLocal会内存泄漏吗线程本地变量先从一个简单的例子开始: class PersonHeigh原创 2021-08-31 12:58:52 · 583 阅读 · 0 评论 -
真正理解Java Volatile的妙用
前言通过这篇文章你将知道:1、什么是线程同步以及为什么需要线程同步2、加一条打印语句可退出循环原因3、volatile为什么不能保证原子性4、cpu 缓存一致性协议(MESI)5、内存屏障的作用6、有了MESI,为啥还需要volatile7、volatile可见性、顺序性原理8、volatile运用在哪些场景概念解析看到volatile就会想到线程同步,那么volatile能够实现线程同步吗?两个前提:什么是线程同步?为什么要进行线程同步?我们知道,在现代计算机原理中,中央处原创 2021-08-24 00:10:57 · 1166 阅读 · 2 评论 -
Java “优雅”地中断线程(原理篇)
前言之前有分析过如何优雅地中断线程,秉着"既要知其然,也要知其所以然"精神,本篇将从底层源码分析中断是如何工作的。通过本篇文章,你将了解到:1、线程底层源码入口2、中断的作用3、Thread.sleep/Object.join/Object.wait 对中断的处理4、究竟该如何停止线程5、疑难点分析1、线程底层源码入口Java 层的Thread以Thread.java里的方法Thread.interrupt()为例,最终调用了interrupt0()方法: private n原创 2021-08-17 23:58:43 · 1181 阅读 · 8 评论 -
Java “优雅”地中断线程(实践篇)
前言在Android开发中,不可避免的会用到线程来执行耗时任务,那如果我们想在中途停止/中断任务的执行,该怎么办呢?先来看看一个简单的线程。 private Thread threadOne = new Thread(new Runnable() { @Override public void run() { try { while(true) { Log.d(TAG,原创 2021-08-15 23:00:22 · 930 阅读 · 0 评论 -
再来捋捋Java 线程状态
前言在现代操作系统里,有进程和线程的概念,我们先来简单了解一下这两个概念。进程是资源分派的基本单位线程是cpu调度基本单位刚开始,计算机系统比较简单,设计者把cpu上执行的每个任务抽象为进程,操作系统统一管理进程的调度,给每个进程分配地址空间、外设等,这些统称为进程的资源。当cpu执行A进程过程中,发现A的时间片已经耗尽,因此先将A进程挂起(释放cpu),并保存进程A的上下文,然后再调度进程B。后来发现每次切换进程的上下文都比较耗时,浪费有限的系统资源,因此将进程再划分为粒度更小的单位,称之原创 2021-08-11 13:50:04 · 675 阅读 · 0 评论 -
Java 线程基础
前言熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性、操作的原子性,进而扩展出的Volatile、锁(CAS/Synchronized/Lock)、信号量等知识。有些文章只说笼统的概念、有些文章深入底层源码令人迷失其中、有些文章只说了其中某个点没有提及内在的联系。基于以上原因,本系列文章尝试由浅入深、系统性地分析、总结Java线程相关知识,算是加深印象、夯实基础,也算是抛砖引玉。若是相关文章对各位看官有所帮助,幸甚至哉。通过本篇文章,你将了解到:原创 2021-08-10 13:10:11 · 1143 阅读 · 3 评论