并发
xiaofang233
开源互联网技术追随者、狂热者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
可重入锁ReentrantLock源码分析
# 什么是可重入锁 可重入锁是指一个线程获得了锁之后仍然可以反复的加锁,不会出现自己阻塞自己的情况。 # 锁类型 ReentrantLock 分为公平锁和非公平锁,可以通过构造方法来指定具体类型: ```java //默认非公平锁 public ReentrantLock() { sync = new NonfairSync(); } //公平锁 public ReentrantLock(boolean fair) { s原创 2020-10-07 02:40:32 · 269 阅读 · 0 评论 -
累加器LongAccumulator用法—基于JDK8
Adder 我们要知道 Adder 和 Accumulator 都是 Java 8 引入的,是相对比较新的类。对于 Adder 而言,比如最典型的 LongAdder,在高并发下 LongAdder 比 AtomicLong 效率更高,因为对于 AtomicLong 而言,它只适合用于低并发场景,否则在高并发的场景下,由于 CAS 的冲突概率大,会导致经常自旋,影响整体效率。 而 LongAdder 引入了分段锁的概念,当竞争不激烈的时候,所有线程都是通过 CAS 对同一个 Base 变量进行修改,但是当竞原创 2020-08-24 20:53:35 · 2019 阅读 · 1 评论 -
AtomicInteger原子操作分析
原子类 在编程领域里,原子性意味着“一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分”。而 java.util.concurrent.atomic 下的类,就是具有原子性的类,可以原子性地执行添加、递增、递减等操作。比如之前多线程下的线程不安全的 i++ 问题,到了原子类这里,就可以用功能相同且线程安全的 getAndIncrement 方法来优雅地解决。 原子类的作用和锁有类似之处,是为了保证并发情况下线程安全。不过原子类相比于锁,有一定的优势: 粒度更细:原子变量可以把竞争范围缩小到原创 2020-08-24 12:17:23 · 595 阅读 · 0 评论 -
延迟队列DelayQueue用法
DelayQueue介绍 我们首先介绍一下DelayQueue,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。 DelayQueue使用场景和用法 DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:缓存系统的设计,缓存中的对象,超过了空闲时间,需要从缓存中移出;任务调度系统,能够准确的把握任务的执行时间。我们可能需要通过线程处理很多时间上要求很严格的数据,如果使用普通的线程,我们就需要遍历所有的对象,一个一原创 2020-08-21 20:32:02 · 869 阅读 · 0 评论 -
阻塞队列介绍以及在线程池中的应用
> BlockingQueue 接口的实现类都被放在了 J.U.C 包中,包括ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue,以及DelayQueue。 # 阻塞队列介绍 ## ArrayBlockingQueue 先从最基础的 ArrayBlockingQueue 说起。ArrayBlockingQueue 是最典型的有界队列,其内部是用数组存储元素的,利用 ReentrantLock 实现线原创 2020-08-21 17:43:13 · 418 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析
CopyOnWriteArrayList JDK1.5 开始,Java 并发包里提供了使用 CopyOnWrite 机制实现的并发容器CopyOnWriteArrayList 作为主要的并发 List,CopyOnWrite 的并发集合还包括 CopyOnWriteArraySet,其底层也是利用 CopyOnWriteArrayList 实现的。 适用场景 读操作可以尽可能的快,而写即使慢一些也没关系 在很多应用场景中,读操作可能会远远多于写操作。比如,有些系统级别的信息,往往只需要加载或者修改很少的原创 2020-08-20 22:56:24 · 234 阅读 · 0 评论 -
CPU缓存一致性(MESI)协议
CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。 时间局部性(Temporal Locality):原创 2020-08-20 19:18:53 · 334 阅读 · 0 评论 -
ThreadLocal内存泄漏分析
什么是内存泄漏 内存泄漏指的是,当某一个对象不再有用的时候,占用的内存却不能被回收,这就叫作内存泄漏。 因为通常情况下,如果一个对象不再有用,那么我们的垃圾回收器 GC,就应该把这部分内存给清理掉。这样的话,就可以让这部分内存后续重新分配到其他的地方去使用;否则,如果对象没有用,但一直不能被回收,这样的垃圾对象如果积累的越来越多,则会导致我们可用的内存越来越少,最后发生内存不够用的 OOM 错误。 下面我们来分析一下,在 ThreadLocal 中这样的内存泄漏是如何发生的。 ...原创 2020-08-17 21:51:47 · 152 阅读 · 0 评论 -
手撕代码—两个线程交替打印1 -- 100
方案一: synchronized + wait/notify public class TwoThreadPrint { private static Object object = new Object(); private static boolean isFlag = false; public static void main(String[] args) { new Thread(() -> { for (int i = 1原创 2020-08-17 19:32:40 · 194 阅读 · 0 评论 -
AQS内部原理分析以及在CountDownLatch中的应用
> 分析CountDownLatch之前先看下AQS,它是并发包中锁和同步器的底层实现,所以理解AQS的工作原理是很有必要的。 # AQS的工作原理 AQS 最核心的三大部分就是**状态、队列和期望协作工具类去实现的获取/释放等重要方法**。我们就从这三个部分出发,分别展开讲解。 ## state 状态 第一个要讲解的是状态 state,如果我们的 AQS 想要去管理或者想作为协作工具类的一个基础框架,那么它必然要管理一些状态,而这个状态在 AQS 内部就是用 state 变量去表示的。它的定义如下:原创 2020-08-17 11:33:25 · 407 阅读 · 1 评论 -
如何设计一个秒杀系统
# 前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。原创 2020-08-16 16:58:24 · 233 阅读 · 0 评论 -
探究JDK7 HashMap并发扩容导致CPU100%原因
HashMap之所以在并发下的扩容造成死循环,是因为,**多个线程并发进行时,因为一个线程先期完成了扩容,将原的链表重新散列到自己的表中,并且链表变成了倒序,后一个线程再扩容时,又进行自己的散列,再次将倒序链表变为正序链表。于是形成了一个环形链表。**当调用get操作并命中链环的桶时,就会进入一个死循环的情况,将CPU的消耗到100%。 ...原创 2020-05-15 17:34:30 · 1150 阅读 · 1 评论 -
基于Redis实现分布式锁
分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理。 ...原创 2020-08-14 11:11:00 · 160 阅读 · 1 评论 -
线程池中线程复用原理
线程复用原理 我们知道线程池会使用固定数量或可变数量的线程来执行任务,但无论是固定数量或可变数量的线程,其线程数量都远远小于任务数量,面对这种情况线程池可以通过线程复用让同一个线程去执行不同的任务,那么线程复用是如何实现的呢? ...原创 2020-08-12 20:13:17 · 2370 阅读 · 0 评论 -
synchronized底层原理和锁优化
# synchronized底层原理 众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: - 同步普通方法,锁的是当前对象。 - 同步静态方法,锁的是当前 Class 对象。 - 同步块,锁的是 () 中的对象。 实现原理: JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。 具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出方法和异常处插入 monitor.exit 的指令。 其本质原创 2020-08-11 17:29:22 · 407 阅读 · 0 评论 -
阻塞/非阻塞队列线程安全剖析
我们将ArrayBlockingQueue和ConcurrentLinkedQueue作为阻塞/非阻塞队列的代表,来剖析一下并发队列线程安全的原理。 # ArrayBlockingQueue线程安全剖析 我们首先看一下 ArrayBlockingQueue 的源码,ArrayBlockingQueue 有以下几个重要的属性: ```java // 用于存放元素的数组 final Object[] items; // 下一次读取操作的位置 int takeIndex; // 下一次写入操作的位置 int原创 2020-08-10 19:47:23 · 472 阅读 · 0 评论 -
ConcurrentHashMap在JDK1.7和JDK1.8的实现对比
Java 8 中,对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级,对比之前 Java 7 版本在诸多方面都进行了调整和变化。 Java 7 版本的 ConcurrentHashMap Java 8 版本的 ConcurrentHashMap原创 2020-08-05 10:20:31 · 622 阅读 · 0 评论 -
深入理解volatile
JMM(JavaMemoryModel) JMM:Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别(注意这个跟JVM完全不是一个东西)。 在正式认识JMM之前,先科普一下现代计算机的内存模型。 ## 现代计算机的内存模型 其实早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器原创 2020-02-29 21:50:19 · 237 阅读 · 0 评论
分享