![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java高并发多线程
文章平均质量分 93
以juc包为主要研究对象,从而学习jdk中高并发多线程容器设计思路,用cas实现无锁编程,为之后研究高并发网络编程打下java基础
踩踩踩从踩
努力 加油 自律 学习 总结
展开
-
JAVA线程池原理详解
1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。原创 2023-11-24 15:36:59 · 214 阅读 · 0 评论 -
多线程并发阻塞队列BlockingQueue、ConcurrentLinkedQueue场景分析
前言对于多线程阻塞队列,在juc包下面提供了各种实现得队列,包括ArrayBlockingQueue 、LinkedBlockingQueue,保证数据线程安全的情况,并使用lock锁中的single 和awaite方法来阻塞起来;以及ConcurrentLinkedQueue 队列适用于并发场景下BlockingQueue是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者.原创 2021-09-24 17:36:11 · 1622 阅读 · 0 评论 -
高并发容器CopyOnWriteArrayList原理解析
CopyOnWriteArrayList实现arraylist多线程数据安全的方式jdk提供的Collections.SynchronizedList() 所有方法进行添加synchronized块 public void add(int index, E element) { synchronized (mutex) {list.add(index, element);} }使用reentrantLock自己对add时,进行对读写操作加锁List原创 2021-09-23 18:48:22 · 1329 阅读 · 0 评论 -
高并发有序的容器ConcurrentSkipListMap原理分析
跳表Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。【数据结构】跳表:Skip List 特性浅析ConcurrentSkipListMap概述ConcurrentSkipListMap基于跳表实现的实现高并发容器,用了一个大...原创 2021-09-23 15:46:58 · 524 阅读 · 0 评论 -
并发容器ConcurrentHashMap原理解析及应用
前言本篇文章主要解析juc包下面的并发容器 ConcurrentHashMap,1.7的实现,以及1.8之后做了哪些优化;对比hashmap做的优化,为什么在hashtable的源码注释上推荐使用ConcurrentHashMap对比。原创 2021-09-23 11:39:31 · 1290 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁原理解析
ReentrantLock及Condition原理解析前言上篇文章主要介绍锁的概念,及ReentrantLock及Condition原理解析 ;如何不使用synchronized也能创建一个锁,并且相对于关键字来说更加优化。本篇文章继续介绍juc包下面的ReentrantReadWriteLock,比可重入锁,粒度更小,更适合与读写操作,在不同的应用场景下有更好的使用读写锁为什么读锁需要加锁,如果只在写的地方加锁,我们只能保证写数据时出现原子性操作,但是同时另外个线程同时读取数据,是会.原创 2021-09-18 17:00:25 · 349 阅读 · 0 评论 -
ReentrantLock及Condition原理解析
锁的概念及synchronized使用原理解析前言前篇文章主要对锁的类型和synchronized如何使用,及锁对象在堆中各个变化状态做了一个分析。然后这篇文章会继续讲解lock的实现ReentrantLock 和condition如何实现及原理解析,与synchronized的对比分析。ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。锁java除了synchronized关键字可以实现...原创 2021-09-17 20:06:36 · 1091 阅读 · 0 评论 -
锁的概念及synchronized使用原理解析
前言在之前的文章中,分析了线程安全常见的 可见性、原子性、有序性产生的原因和解决办法。接着这篇文章会接着讲解线程相关的锁的概念,包括什么是自旋锁,重量级锁、轻量级锁、公平锁、乐观锁等等;以及从底层分析java在堆中如何存储对象,并解析synchronized怎么锁住对象,以及简单应用,基本概念等等。锁的概念java中将锁分为下面几种类型自旋锁:是指一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断锁是否能够被获取,直到获取成功锁才会推出循环。表现形式:原创 2021-09-16 16:45:53 · 211 阅读 · 0 评论 -
高并发多线程安全之信号量、线程组、守护线程、线程栅栏等的分析
高并发多线程安全之原子性问题、CAS机制及问题解决方案多线程编程 之java内存模型(JMM)与可见性问题前言前两篇文章主要分析的是 线程安全中java内存模型;以及常见的线程安全三大问题:原子性、可见性、有序性问题这篇文章主要做信号量、线程组、守护线程、线程栅栏等的分析,如何应用在实际开发过程中。线程组ThreadGroup的提出是为了方便线程的管理,通过它可以批量设定一组线程的属性,比如 setDaemon,设置未处理异常的处理方法,设置统一的安全策略等等;也可以通过线程组方原创 2021-09-15 18:10:20 · 265 阅读 · 0 评论 -
高并发多线程安全之原子性问题、CAS机制及问题解决方案
多线程编程 之java内存模型(JMM)与可见性问题前言在java内存模型中,对多线程间交互,涉及到原子性问题、可见性问题、以及有序性问题;这篇文章主要讲解的是多线程高并发的原子性问题,以及解决原子性问题、CAS机制、自旋锁的优缺点、以及ABA问题等什么是原子操作定义即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。通过下面代码来看出来public class Counter { volatile int i = 0;原创 2021-09-15 15:15:56 · 1098 阅读 · 0 评论 -
多线程编程 之java内存模型(JMM)、可见性、有序性问题解决方案
前言在java多线程编程中涉及到线程之间数据交互,会涉及到很多不可控性,包括cpu中缓存机制,以及jvm中为提高代码运行效率,从而进行的指令重排,jit解释器优化,缓存技术等等,而JMM则是使多线程可控,而提出的规范;本篇文章主要讲解java内存模型详解和多线程数据的可见性问题java内存模型定义java语言规范描述java语言特性,包括基本类型、强类型语言、泛型、各种特性等等; java虚拟机规范则描述的是虚拟机运行时内存数据区域,内存回收机制等等; java内存模型指的是java语言原创 2021-09-14 19:48:26 · 241 阅读 · 0 评论 -
高并发多线程基础之ThreadPoolExecutor源代码分析
前言这篇主要讲述ThreadPoolExecutor的源码分析,贯穿整篇文章主要就 线程池的创建、参数分析、提交任务,通过源码及注释充分理解线程池的工作原理。线程池为什么需要需要线程池首先线程并不是越多越好,过多的创建线程消耗大量的资源,反而达到适得其反的效果;如何正确创建线程并且去控制。线程池的组成部分线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;工作线程:线程池中的线程、可以循环的执行任务、在没有任务时处于等待状态任务接口:每个任务必须实现的原创 2021-09-14 13:36:12 · 201 阅读 · 0 评论 -
高并发多线程基础之线程间通信与数据共享及其应用
前言本篇文章主要介绍的是java多线程之间如何通信,协同处理任务,以及数据共享,定时任务处理等操作。多线程之间通信的方式在实际开发过程中多个线程同时操作,有两种情况的,数据共享和线程间协作数据共享的方式 文件共享数据 通过文件达到多线程间数据共享public static void main(String[] args) throws Exception { Path path = Paths.get("file.log"); // 线程1 -..原创 2021-09-09 21:05:43 · 432 阅读 · 0 评论 -
高并发多线程基础之线程池
高并发多线程之线程基础中生命周期、线程封闭、cpu缓存前言在上篇文章,主要讲解的是线程的生命周期、如何终止线程、线程屏障、cpu缓存与指令重排等;而本篇文章描述我们jdk给我们提供的线程池,以及线程间如何进行通信。线程池的原理为什么要使用线程池首先线程并不是越多越好,过多的创建线程消耗大量的资源,反而达到适得其反的效果;如何正确创建线程并且去控制。线程不仅仅java中的一个对象,每个线程都有自己的工作内存空间。线程创建、销毁需要时间,消耗性能线程...原创 2021-09-08 21:49:13 · 242 阅读 · 0 评论 -
高并发多线程之线程基础中生命周期、线程封闭、cpu缓存
前言本篇文章主要介绍线程的基础,什么是线程、线程的状态、线程封闭、cpu缓存和内存屏障、指令重排等概念什么是线程原创 2021-09-04 16:26:19 · 187 阅读 · 0 评论 -
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记
前言我读深入理解java虚拟机时,下面做一个整体的读书笔记 ,去学习该本书。 我会在本篇博客中做一些书中的思考和感悟深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)pdf提取码:hdiu该本书分为下面几部分第一部分 走进java 第一章 主要介绍了Java技术体系过去、现在的情况以及未来的发展趋势;并介绍如何实现openjdk12第二部分 自动内存管理 第二章 虚拟机内存划分,各个区域出现内存溢出异常的常见原因 第三章...原创 2021-07-03 18:49:09 · 2785 阅读 · 1 评论