
JAVA并发专题
文章平均质量分 90
java并发技术专题
技术路上的苦行僧
不怕别人天赋比你高,就怕别人比你更努力
展开
-
JAVA源码分析之HashMap 1.7
一、简介类定义:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable二、数据结构2.1具体描述HashMap采用的数据结构为:数组+链表,该数据结构方式也称为:...原创 2020-02-23 14:11:03 · 327 阅读 · 0 评论 -
并发专题(10)之FutureTask源码剖析
Java创建线程的方式,一般常用的是Thread,Runnable,如果需要处理当前的任务有返回结果的话,需要使用Callable。Callable运行需要配合Future来使用。Future是一个接口,一般会使用FutureTask实现类去接收Callable任务的返回结果。FutureTask存在的问题就是同步非阻塞执行的任务,他不会主动通知你返回结果是什么。原创 2024-12-07 14:04:16 · 329 阅读 · 0 评论 -
并发专题(9)之JUC阻塞队列源码分析
DelayQueue是无界队列,延迟的操作,可以向延迟队列追加任务,这个任务需要指定延迟时间,只有延迟时间到了,才可以将任务从队列中获取出来。任务可以指定延迟时间,所以需要任务满足一定的需求,DelayQueue的任务需要实现Delayed接口,重写getDelay方法和compare方法。getDelay:任务什么时候可以出队列。。compareTo:存放任务到队列时,放在二叉堆的哪个位置。原创 2024-12-05 20:13:24 · 739 阅读 · 0 评论 -
并发专题(8)之JUC阻塞容器源码剖析
ArrayBlockingQueue底层是采用数组实现的一个队列。因为底层是数据,一般被成为有界队列、其阻塞模式是基于ReentrantLock来实现的。// 存数据操作 add(E),offer(E),put(E),offer(E,time,unit) // add(E):添加数据到队列,如果满了,扔异常。原创 2024-12-03 16:31:25 · 991 阅读 · 0 评论 -
并发专题(7)之JUC并发工具源码分析
CountDownLatch本身就好像一个计数器,可以让一个线程或多个线程等待其他线程完成后再执行。原创 2024-11-30 15:54:43 · 605 阅读 · 0 评论 -
并发专题(6)之ConcurrentHashMap源码剖析
HashMap和ConcurrentHashMap的存储结构是一致的。ConcurrentHashMap是线程安全的。原创 2024-11-29 18:44:59 · 378 阅读 · 0 评论 -
并发专题(5)之ThreadPoolExecutor源码剖析
为了避免频繁的创建和销毁线程造成不必要的开销,一般在使用线程时,会采用线程池的方式。。以上的数量只是常规的数量配置,但是实际设置数量要根据压测,以及对线程池的监控才能得出最适合的线程配置。原创 2024-11-27 14:45:48 · 511 阅读 · 0 评论 -
并发专题(4)之ReentrantReadWriteLock读写锁源码分析
因为ReentrantLock是互斥锁,如果有一个操作是读多写少,同时还需要保证线程安全,那么使用ReentrantLock会导致效率比较低。因为多个线程在对同一个数据进行读操作时,也不会造成线程安全问题。所以就出现了读写锁。读读操作是共享的。写写操作是互斥的。读写操作是互斥的。写读操作是互斥的。单个线程获取写锁后,再次获取读锁,可以拿到。(写读可重入)单个线程获取读锁后,再次获取写锁,拿不到。(读写不可重入。原创 2024-11-26 11:31:25 · 619 阅读 · 0 评论 -
并发专题(2)之ThreadLocal详解
JVM 利用设置 ThreadLocalMap 的 Key 为弱引用,来避免内存泄露。JVM 利用调用 remove 、get 、set 方法的时候,回收弱引用。当 ThreadLocal 存储很多 Key 为 null 的 Entry 的时候,而不再去调用 remove、 get 、set 方法,那么将导致内存泄漏。使用线程池+ ThreadLocal 时要小心, 因为这种情况下, 线程是一直在不断的 重复运行的,从而也就造成了 value 可能造成累积的情况。原创 2024-11-20 19:59:40 · 1019 阅读 · 0 评论 -
并发专题(1)之深入理解并发、线程与等待通知机制
我们常听说的是应用程序, 也就是 app ,由指令和数据组成。但是当我们不 运行一个具体的 app 时,这些应用程序就是放在磁盘(也包括 U 盘、远程网络 存储等等)上的一些二进制的代码。一旦我们运行这些应用程序,指令要运行, 数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中 还需要用到磁盘、网络等设备,从这种角度来说, 进程就是用来加载指令、管理 内存、管理 IO 的。进程就可以视为程序的一个实例。原创 2024-11-19 17:54:38 · 865 阅读 · 0 评论 -
多线程编程(13)之ConcurrentHashMap深度源码分析
学习ConcurrentHashMap基本概念以及它底层的数据结构。数据结构如下:数组+链表+红黑树+锁(synchronized+cas)。原创 2024-05-30 16:43:15 · 915 阅读 · 0 评论 -
多线程编程(12)之HashMap1.8源码分析
之前已经分析过了一版1.7版本的HashMap,这里主要是来分析一下1.8HashMap源码。原创 2024-05-27 15:26:09 · 748 阅读 · 0 评论 -
JAVA并发专题(2)之JMM&synchronized&volatile详解
Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。原创 2023-07-11 15:27:57 · 205 阅读 · 0 评论 -
JAVA并发专题(1)之操作系统底层工作的整体认识
现代计算机模型是基于-冯诺依曼计算机模型,计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作模型。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼计算机模型。原创 2023-05-16 16:15:19 · 476 阅读 · 1 评论 -
多线程编程(11)之手撕ThreadPoolExecutor源码
一、线程池线程池”,顾名思义就是一个线程缓存,线程是稀缺资源,如果被无限制的创建,不 仅会消耗系统资源,还会降低系统的稳定性,因此Java中提供线程池对线程进行统一分配、 调优和监控。二、线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行 处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁 线程,如此一来会大...原创 2021-08-19 17:38:22 · 224 阅读 · 0 评论 -
多线程编程(10)之深入理解AQS 队列同步器
一、前言AbstractQueuedSynchronizer 简称 AQS,是一个抽象类的队列式同步器,它的内部通过维护一个状态volatile int state(共享资源),一个FIFO线程等待队列来实现同步功能。可能我们几乎不会直接去使用它,但它却是 JUC 的核心基础组件,支撑着 java 锁和同步器的实现,例如ReentrantLock、ReentrantReadWriteLock、CountDownLatch,以及Semaphore等。大神Doug Lea在设计 J...原创 2021-08-13 10:53:42 · 713 阅读 · 1 评论 -
多线程编程(9)之死磕Synchronized原理
这篇文章有点长,大家仔细点看,上篇博客已经介绍了https://blog.youkuaiyun.com/jokeMqc/article/details/115524141synchronized的原理,但是我总体看了下来感觉对于synchronized还是比较的模糊,然后本篇主要是把JVM源码下载下来看具体Synchronized的具体实现原理,这里跟大家分享一下。一、内存模型1.1为什么要有内存模型在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的原创 2021-04-13 13:52:15 · 669 阅读 · 0 评论 -
多线程编程(8)之深入分析 synchronized 的实现原理
记得刚刚开始学习 Java 的时候,一遇到多线程情况就是 synchronized,相对于当时的我们来说 synchronized 是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道 synchronized 是一个重量级锁,相对于 Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。诚然,随着 Javs SE 1.6对 synchronized 进行的各种优化后,synchronized 并不会显得原创 2021-04-08 16:58:14 · 212 阅读 · 0 评论 -
多线程编程(7)之多线程详细介绍(最全)
一、Java线程池ExecutorService系统里面用到了线程池:private static final ExecutorService EXECUTOR_SERVICE = new ThreadPoolExecutor(16, 32, 5L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1000), new ThreadFactory() { private final原创 2021-02-25 10:46:10 · 477 阅读 · 0 评论 -
多线程编程(6)之三种实现有返回值的多线程
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有原创 2021-02-25 09:57:36 · 3301 阅读 · 2 评论 -
多线程编程(5)之CopyOnWriteArrayList源码分析
一、简介CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。二、继承体系CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializab...原创 2019-10-14 21:08:27 · 668 阅读 · 0 评论 -
多线程编程(4)之ConcurrentHashMap
当 Hash 冲突严重时,在桶上形成的链表会变的越来越长,这样在查询时的效率就会越来越低;时间复杂度为O(N)。原创 2019-10-13 14:08:34 · 662 阅读 · 0 评论 -
多线程编程(3)之ThreadLocal 原理和使用场景
一、什么是ThreadLocalThreadLocal 是 JDKjava.lang包中的一个用来实现相同线程数据共享不同的线程数据隔离的一个工具。 我们来看下 JDK 源码中是如何解释的:This class provides thread-local variables. These variables differ from their normal counterparts...原创 2019-10-12 14:45:15 · 370 阅读 · 0 评论 -
多线程编程(2)之Java并发介绍
到目前为止,你学到的都是顺序编程,顺序编程的概念就是某一时刻只有一个任务在执行,顺序编程固然能够解决很多问题,但是对于某种任务,如果能够并发的执行程序中重要的部分就显得尤为重要,同时也可以极大提高程序运行效率,享受并发为你带来的便利。但是,熟练掌握并发编程理论和技术,对于只会CRUD的你来说是一种和你刚学面向对象一样的一种飞跃。正如你所看到的,当并行的任务彼此干涉时,实际的并发问题就会接踵而至...原创 2019-09-02 15:54:22 · 200 阅读 · 0 评论 -
多线程编程(1)之Java 中15种锁的介绍
这里主要介绍Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:1.公平锁 / 非公平锁2.可重入锁 / 不可重入锁3.独享锁 / 共享锁4.互斥锁 / 读写锁5.乐观锁 / 悲观锁6.分段锁7.偏向锁 / 轻量级锁 / 重量级锁8.自旋锁上面是很多锁的名词,这些分类并不是全是指锁的...原创 2019-08-31 22:27:04 · 217 阅读 · 0 评论 -
深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
阻塞队列概要阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列支出阻塞添加和阻塞删除方法。阻塞添加 所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。阻塞删除 阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作(一般都会返回被删除的元素)由于Ja...转载 2018-07-09 01:06:40 · 245 阅读 · 0 评论