
Java高并发编程入门
文章平均质量分 92
本专栏主要介绍Java并发容器与数据结构,介绍的并发容器有CopyOnWriteArrayList,ConcurrentHashMap,BlockingDeque等,订阅本专栏,如碰到问题,可添加博主微信一对一的解答
码农飞哥
csdn博客专家,讯飞程序员,影刀高级RPA工程师,几十款RPA工具等你拿 1736334084
展开
-
第一篇:并发容器学习开篇介绍
本文简单概述了Java并发包下的一些常用的类。后续的博客将围绕着这些类来剖析。原创 2020-01-19 15:45:35 · 3431 阅读 · 0 评论 -
由一个多线程并发保存而引发的思考
由一个多线程并发保存引发的思考原创 2023-09-14 07:00:00 · 288 阅读 · 0 评论 -
【Docker的使用基础】Mac下利用Docker安装 Kafka
【Docker的使用基础】Mac下利用Docker安装 Kafka原创 2023-07-30 11:04:23 · 1955 阅读 · 3 评论 -
【Docker的使用基础】Mac下利用Docker安装Redis
Mac下利用Docker安装Redis原创 2023-07-29 22:12:46 · 1909 阅读 · 2 评论 -
六万字【Java高并发编程入门】第十九篇:并发编程入门总览包教包会【值得收藏】
高并发其实并没有那么难原创 2021-10-17 23:01:41 · 2971 阅读 · 7 评论 -
第一篇(1):原子性,可见性,有序性
并发编程世界里,由于CPU缓存导致的可见性问题,线程切换导致的原子性问题,以及编译器重排序导致的有序性问题是并发编程Bug的根源。原创 2019-10-28 21:02:53 · 1796 阅读 · 0 评论 -
第一篇(2):Java内存模型
Java 内存模型是一个很复杂的规范,本质上可以理解为:Java内存模型规范了JVM如何提供按需禁用缓存和编译优化(本质上是指令重排序)的方法。具体来说,这些方法包括:通过volatile,synchronized,final原创 2019-10-29 16:21:33 · 1575 阅读 · 0 评论 -
第二篇:原子类的说明与使用
今天我们来学习下并发包中的原子类。原子类是用来处理基本数据类型自增在并发环境下的线程安全问题而生的。下面我们就来看看原子类吧。有哪些原子类原子类作用AtomicBoolean用于处理boolean类型数据的原子类AtomicInteger用于处理Integer类型数据的原子类AtomicLong用于处理Long类型数据的原子类AtomicRefere...原创 2020-01-19 19:22:33 · 1884 阅读 · 0 评论 -
第三篇(1) : synchonized解决原子性问题
Java自带的锁工具是synchronized,用synchronized修饰的代码就相当于上了锁。上了锁就需要互斥执行。即:同一时刻只能有一个线程执行。原创 2019-10-30 20:34:10 · 1662 阅读 · 0 评论 -
第三篇(2):lock的学习与使用
今天我们来学习并发包下的Lock(锁)的知识。之所以Java在有synchronized的情况下,还提供基于lock接口实现的锁。是由于lock有一些synchronized没有特性。可以再发生死锁时相应中断,释放锁。原创 2020-01-19 16:48:13 · 1842 阅读 · 0 评论 -
第三篇(3):死锁的发生与避免
不当的加锁方式可能就会导致死锁。原创 2019-11-01 08:58:19 · 1664 阅读 · 0 评论 -
第三篇(4):线程间通信
线程间的通信很重要原创 2019-11-01 20:38:35 · 1494 阅读 · 0 评论 -
第四篇:走近CopyOnWriteArrayList(基于JDK1.8)
熟悉Java开发的童鞋都知道ArrayList是线程不安全的,在多线程的环境下可能会发生fast-fail机制,抛出ConcurrentModificationException异常,虽然也有并发容器Vector,或者采用Collections的synchronizedCollection方法将ArrayList包装成线程安全类,但是这两种方式都是利用synchronized关键字修饰方法,利用独占锁来保证线程安全,由于独占锁在同一时刻只有一个线程能够获取到对象监视器即读写操作不能并行,所以效率不高。而Co原创 2020-01-28 17:38:48 · 1810 阅读 · 0 评论 -
第五篇:HashMap的源码分析(基于JDK1.8)
今天我们接着来学习HashMap的源码,HashMap的数据结构与ConcurrentHashMap的数据结构相同,所以学好HashMap对后面学习ConcurrentHashMap很有帮助。目录基本的全局常量HashMap的数据结构HashMap的散列函数散列冲突的处理HashMap的扩容机制put 方法的源码解析get 方法和remove的源码解析环境本代码基于JDK1...原创 2020-01-28 20:35:33 · 1838 阅读 · 0 评论 -
第六篇:走近ConcurrentHashMap(基于JDK1.8)
ConcurrentHashMap是一个并发散列映射表的实现,它允许完全并发的读取,并且支持给定数量的并发更新,比Hashtable的性能更高,在JDK1.8中的并发控制是通过CAS+synchroinzed 来实现的,摒弃了JDK1.8之前的分段锁实现方式。原创 2020-01-30 12:58:41 · 3057 阅读 · 0 评论 -
第七篇:ConcurrentHashMap扩容的详细介绍以及多线程测试(基于JDK1.8)
前言前面对ConcurrentHashMap做了个一个整体的介绍,但是还有些疑问没问解决?ConcurrentHashMap是啥时候进行扩容的?ConcurrentHashMap到底是怎么扩容的呢?ConcurrentHashMap在扩容时为啥要构造链表的反序排列?ConcurrentHashMap为啥不允许key和value为null呢?带着这三个问题,我们来开始今天的学习。C...原创 2020-01-31 23:30:01 · 1910 阅读 · 0 评论 -
第八篇:链表的学习:链表的头插法和尾插法以及HashMap中链表结点的插入方式
前言从前面的HashMap和ConcurrentHashMap的源码分析我们可以得知,其内部的数据结构都用到了链表,所以,对链表的深入掌握非常有必要。本文将重点介绍单链表数据结构,然后通过代码实现单链表的头插法和尾插法。单链表的介绍我们都知道数组是需要一块连续的内存空间来存储的,而链表只需要零散的内存碎片,通过指针相连即可。首先我们来看看最简单的链表-----单链表。如上图所示,分别是一...原创 2020-01-31 21:18:32 · 2894 阅读 · 0 评论 -
第九篇:队列的学习(一)用数组和链表实现单向队列
本文我们主要介绍了如何用数组和链表实现单向队列。队列是一种操作受限先进先出的的线性表数据结构,其只有入队和出队操作。可以通过数组和链表来实现队列原创 2020-02-04 21:30:06 · 1793 阅读 · 0 评论 -
第十篇:队列的学习(二) 循环队列
循环队列相对单向队列,最大的优势就是不需要进行数据的迁移,出队时间复杂度是O(1)。实现循环队列需要注意的就是队空和队满的判断。原创 2020-02-05 23:38:29 · 1709 阅读 · 0 评论 -
第十一篇 队列的学习(三) 手写一个阻塞队列
本文我们手写了一个阻塞队列,队列的数据结构采用数组来实现。队列的阻塞功能分别用了`synchronized(this)`、`this.wait()`、`this.notifyAll()`的方式和`ReentrantLock`和`Condition`的`await()`以及`signalAll()`和`signal()`两种方式来实现阻塞功能,本质上就是生产者-消费者模型。。在JDK中ArrayBlockingQueue实现队列阻塞就是通过`ReentrantLock`和`Condition`的`await(原创 2020-02-07 13:22:41 · 2106 阅读 · 0 评论 -
第十二篇:ArrayBlockingQueue的源码解析(基于JDK1.8)
本文对ArrayBlockingQueue的源码进行了剖析,主要介绍了入队和出队的相关方法。并且对其实现阻塞功能的原理进行了详细的解释。其原理是运用了生产者-消费者模型。内部的数据结构是数组原创 2020-02-08 20:06:58 · 1873 阅读 · 0 评论 -
第十三篇:LinkedBlockingQueue的源码解析(基于JDK1.8)
LinkedBlockingQueue是一个基于链表实现的阻塞queue,它的性能好于ArrayBlockingQueue,但是差于ConcurrentLinkedQueue;并且它非常适于生产者消费者的环境中,比Executors.newFixedThreadPool()就是基于这个队列的,使用LinkedBlockingQueue时一定要设置容量,不然会有内存溢出的风险。原创 2020-02-09 22:41:25 · 1854 阅读 · 0 评论 -
第十五篇:LinkedBlockingDeque的源码解析(基于JDK1.8)
LinkedBlockingDeque的定义LinkedBlockingDeque是一个通过链表实现的双端阻塞队列,如果不指定大小时,则默认的大小是Integer.MAX_VALUE,实现原理与LinedBlockingQueue类似。都是通过ReentrantLock+Condition+链表。使用LinkedBlockingDeque 有哪些风险呢在未来指定容量的情况下,生产速率远高于...原创 2020-02-15 20:48:04 · 1880 阅读 · 0 评论 -
第十四篇:ConcurrentLinkedQueue的源码解析(基于JDK1.8)
ConcurrentLinkedQueue的定义ConcurrentLinkedQueue是 非阻塞的单端队列,其是一个通过链表实现的并发安全的队列。是java中并发环境下性能最好的队列,它是使用非阻塞算法(CAS)来实现线程安全的。它采用先进先出的规则对节点进行排序,当我们添加一个元素时,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。ConcurrentLinkerQu...原创 2020-02-14 22:36:48 · 1981 阅读 · 0 评论 -
第十六篇:面试必备的线程池知识-线程池的使用
本文主要介绍了介绍了线程池的优点,其主要就是减少创建创建和销毁线程所花费的时间和系统资源的开销,然后,介绍了`Executors`中几种创建线程池的方式,不过不推荐使用,接着介绍了正确创建线程池的姿势,着重介绍了ThreadPoolExecutor类的构造器和`execute()`方法。最后提到了在SpringBoot中使用线程池。原创 2020-02-24 22:20:16 · 2301 阅读 · 0 评论 -
第十七篇:面试必备的线程池知识-线程池的原理
本文对线程池添加任务,执行任务的源码做了重点解析,内部用到了很多设计模式,比如创建线程用到了工厂模式,设置线程的属性用到了建造者模式。同时还用到了锁等知识。了解其实现原理对我们更好的使用线程池大有好处。原创 2020-02-26 21:55:10 · 2148 阅读 · 2 评论 -
第十八篇:ThreadLocal的原理解析以及应用场景分析
本文简单的介绍了ThreadLocal的使用原创 2019-11-11 18:16:46 · 2025 阅读 · 0 评论