并发编程篇
文章平均质量分 91
半桶水的码农
这个作者很懒,什么都没留下…
展开
-
线程池专栏
目录一、为什么要用线程池?二、线程池的核心参数三、任务调度流程四、线程池中常见5种工作队列五、四种常见饱和策略六、Executors类七、参数配置方案美团方案Netty进阶指南给出来的方案一、为什么要用线程池?线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。 对资源无限申请缺少抑制手段,易引原创 2021-04-09 17:49:36 · 4304 阅读 · 0 评论 -
AQS
目录一、ReentrantLock核心组件二、AQS加锁和释放原理三、公平与非公平,可重入与独占java并发包下很多API都是基于AQS来实现的加锁和释放锁等功能的,比如ReentrantLock、ReentrantReadWriteLock底层都是基于AQS来实现的。AQS是java并发包的基础类,今天这一节主要是梳理AQS的重要概念和原理细节。一、ReentrantLock核心组件ReentrantLock核心有3个组件:state、owner、AQS(抽象队列同步器,简单原创 2021-04-09 17:29:16 · 150 阅读 · 0 评论 -
Semaphore
目录一、概念理解二、代码使用三、其他方法Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了。这篇文章将对Semaphore的概念和使用进行一个详解。一、概念理解官方是这样解释的:Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,他维护了一个许可证集合,有多少资源需要限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只能有N个线程访问。一个线程获取许可证就调用ac原创 2021-04-09 17:16:40 · 177 阅读 · 0 评论 -
CyclicBarrier
目录一、概念理解二、代码演示三、源码分析一、概念理解CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。就比如说我们在打王者的时候,十个人必须全部加载到100%,才可以开局。否则只要有一个人没有加载到100%,那这个游戏就不能开始。先加载完成的玩家必须等待最后一个玩家加载成功才可以。如果你实在记不住,你可以想象成人满发车的长途,就算你是第一个上车的人,也原创 2021-04-09 17:06:20 · 107 阅读 · 0 评论 -
CountDownLatch
目录一、定义二、使用三、原理一、定义CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。注意:java中还有一个同步工具类叫做CyclicBarrier,他的作用和CountDownLatch类似。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都原创 2021-04-09 16:54:26 · 46229 阅读 · 10 评论 -
CAS及ABA问题
目录一、为什么需要CAS机制?二、分析CAS学习Java并发编程,CAS机制都是一个不得不掌握的知识点。这篇文章主要是从出现的原因再到原理进行一个解析。希望对你有所帮助。一、为什么需要CAS机制?为什么需要CAS机制呢?我们先从一个错误现象谈起。我们经常使用volatile关键字修饰某一个变量,表明这个变量是全局共享的一个变量,同时具有了可见性和有序性。但是却没有原子性。比如说一个常见的操作a++。这个操作其实可以细分成三个步骤:(1)从内存中读取a(2)对a进行加1操作原创 2021-04-09 16:21:47 · 643 阅读 · 0 评论 -
AtomicInteger
目录一、从a++说起为什么使用AtomicInteger二、原理分析三、总结java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。一、从a++说起为什么使用AtomicInteger我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这个Atomi原创 2021-04-09 14:44:59 · 7317 阅读 · 2 评论 -
Synchronized
目录一、synchronized的简单介绍二、synchronized应用三、synchronized原理四、synchronized的改进与优化五、syncchronized的深度思考一、synchronized的简单介绍关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要原创 2021-04-09 12:30:05 · 1238 阅读 · 2 评论 -
Volatile
目录一、保证可见性二、保证有序性三、不具备原子性四、和Synchronized的内存屏障差别要想讲清楚volatile关键字,这时候就应该主动从内存模型开始讲起,然后说原子性、可见性、有序性的理解,铺垫好这些才是到volatile关键字的原理,假定前面一篇内存模型的文章已经理解到位了,那么这里直接从volatile的原理开搞!首先说结论,volatile关键字作用的是保证可见性和有序性,并不保证原子性。只有synchronized关键字同时保证上述三种特性。但是volatile是轻原创 2021-04-09 11:22:49 · 195 阅读 · 0 评论 -
内存模型
目录一、JMM 内存模型二、可见性、原子性和有序性三、重排序的相关问题Java内存模型(Java Memory Model,JMM)JSR-1337制定的规范,定义程序中变量的访问规则,屏蔽掉Java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在跨平台上都能达到内存访问的一致性。一、JMM 内存模型首先要记住有三个组件,CPU、工作内存和主内存,访问顺序也是按照如下图箭头的顺序来的。处理器(cpu): 寄存器:每个cpu都包含一系列寄存器原创 2021-04-09 10:21:27 · 319 阅读 · 0 评论