【多线程】JUC
阿里内部高并发核心编程笔记:多线程、锁、JMM、JUC、设计模式
前两天看到一个大佬写的博客,提到高阶开发者必须掌握的技能,其中他明确提出了“精通多线程性能调优”。为什么多线程对开发人员如此重要?第一,不管你去面试哪家公司,java多线程是必问项,而且多线程使用范围广,无论如何是避不开的;第二,你对多线程掌握的越深入,意味着你能做的事情越多。实现业务功能,要掌握多线程; 性能优化,那么底层原理就要摸透; 使用多线程,锁你就必须得了解; 使用锁,你得知道各种锁的优
日期 2023-06-12 10:48:40Java多线程系列–“JUC锁”02之 互斥锁ReentrantLock详解编程语言
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括: ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。Reentrant
日期 2023-06-12 10:48:40007-多线程-JUC线程池-Spring线程池配置、池子如何配置参数
一、概述 Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现。 1.1、xml方式配置 <!-- Spring线程池 --> <bean id="taskExecutor" class="org.springframework.sc
日期 2023-06-12 10:48:40006-多线程-JUC线程池-并发测试程序
一、java代码模拟并发 1.1、一次并发 单次并发测试 1、使用CountDownLatch 等待一个或多个线程一起执行 详细参看:007-多线程-锁-JUC锁-CountDownLatch-闭锁【允许一个或多个线程,等待其他一组线程完成操作,再继续执行】 示例代码 @Test public void poolCountDownLatch() throws Excep
日期 2023-06-12 10:48:40010-多线程-JUC集合-Queue-ConcurrentLinkedQueue
一、概述 ConcurrentLinkedQueue是线程安全的队列,它适用于“高并发”的场景。 它是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。 在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻
日期 2023-06-12 10:48:40009-多线程-JUC集合-Queue-LinkedBlockingDeque
一、概述 LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);并且,该阻塞队列是支持线程安全。 此外,LinkedBlockingDeque还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。 1.1、原理和数据结构
日期 2023-06-12 10:48:40008-多线程-JUC集合-Queue-LinkedBlockingQueue
一、概述 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。 此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认
日期 2023-06-12 10:48:40007-多线程-JUC集合-Queue-BlockingQueue接口以及ArrayBlockingQueue
0、BlockingQueue接口介绍 BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。 BlockingQueue不光实现了一个完整队列所具有的基本功能,同时在多线程环境下,他还自动管理了多线间的自动等待于唤醒功能,从而使得程序员可以忽略这些细节,关注更高级的功能。&nbs
日期 2023-06-12 10:48:40003-多线程-JUC集合-Set-CopyOnWriteArrayList
一、概述 它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类AbstractSet;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不是散列表。和CopyOnWrit
日期 2023-06-12 10:48:40002-多线程-JUC集合-List-CopyOnWriteArrayList
一、概述 CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteSet。 CopyOnWriteArrayList容器允许并发读,读操作是无锁的,性能较高。至于写
日期 2023-06-12 10:48:40012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue
一、SynchronousQueue概述 SynchronousQueue是一个不存储元素的队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。 它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。SynchronousQueue类只有两个构造方法: public SynchronousQueue() { this(false); } public
日期 2023-06-12 10:48:40011-多线程-JUC集合-Queue-PriorityBlockingQueue和DelayQueue
一、PriorityBlockingQueue简介 PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。 二、DelayQu
日期 2023-06-12 10:48:40001-多线程-JUC集合-框架概述
一、概述 1.1、java集合 java集合的架构,主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)和Set(集合)。 1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack。 (01) LinkedList是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。(02)&n
日期 2023-06-12 10:48:40009-多线程-锁-JUC锁-Semaphore 信号量【控制一定数量的许可(permit)的方式,来达到限制通用资源访问的目的】
一、概述 Semaphore是一个计数信号量。从概念上将,Semaphore包含一组许可证。如果有需要的话,每个acquire()方法都会阻塞,直到获取一个可用的许可证。每个release()方法都会释放持有许可证的线程,并且归还Semaphore一个可用的许可证。然而,实际上并没有真实的许可证对象供线程使用,Semaphore只是对可用的数量进行管理维护。 信号量机制是一种有限数量的共
日期 2023-06-12 10:48:40008-多线程-锁-JUC锁-CyclicBarrier【让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行】
一、概述 “循环栅栏”。大概的意思就是一个可循环利用的屏障。 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时
日期 2023-06-12 10:48:40007-多线程-锁-JUC锁-CountDownLatch-闭锁【允许一个或多个线程,等待其他一组线程完成操作,再继续执行】
一、概述 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,指定的一个或多个线程等待其他线程执行完成后执行。 能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。 闭锁是一种同步工具类,可以延迟线程的进度,直到其到达终止状态。闭锁的作用相当于一扇门
日期 2023-06-12 10:48:40006-多线程-锁-JUC锁-ReentrantReadWriteLock可重入读写锁
一、概述 ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。 读
日期 2023-06-12 10:48:40005-多线程-锁-JUC锁-LockSupport【使用、Unsafe、对比Object的wait、底层源码】
一、概述 在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步组件的基础工具。 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park() 和
日期 2023-06-12 10:48:40004-多线程-锁-JUC锁-Condition条件
一、概述 任何一个Java对象,都拥有一组监视器方法,主要包括wait()、notify()、notifyAll()方法,这些方法与synchronized关键字配合使用可以实现等待/通知机制。使用这种方式实现了生产者-消费者模式。 类似地,Condition接口也提供类似的Object的监视器的方法,主要包括await()、signal()、signalAll()方法,这些方法与Loc
日期 2023-06-12 10:48:40003-多线程-锁-JUC锁-Lock及ReentrantLock、公平锁、非公平锁
一、概述 重入锁ReentrantLock,就是支持重进入的锁 ,它表示该锁能够支持一个线程对资源的重复加锁。支持公平性与非公平性选择,默认为非公平。 以下梳理ReentrantLock。作为依赖于AbstractQueuedSynchronizer。 所以要理解ReentrantLock,先要理解AQS。013-AbstractQueuedSynchronizer-用于构建
日期 2023-06-12 10:48:40001-多线程-锁-架构【同步锁、JUC锁】
一、概述 Java中的锁,可以分为"同步锁"和"JUC包中的锁"。 1.1、同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支持同步锁了。 同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU
日期 2023-06-12 10:48:40010-多线程-JUC原子类-atomic包的原理及分析
一、Atomic简介 Atomic包是java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中
日期 2023-06-12 10:48:40005-多线程-JUC线程池-Future、FutureTask、CompletionService 、CompletableFuture
一、概述 创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。 详述:https
日期 2023-06-12 10:48:40004-多线程-JUC线程池-ThreadFactory线程工厂
一、源码分析 ThreadFactory是一个线程工厂。用来创建线程。这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程。线程一些特性等,如优先级。通过这个TreadFactory创建出来的线程能保证有相同的特性。它首先是一个接口类,而且方法只有一个。就是创建一个线程。 public interface ThreadFactory { Th
日期 2023-06-12 10:48:40003-多线程-JUC线程池-几种特殊的ThreadPoolExecutor【newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool】
一、概述 在java doc中,并不提倡我们直接使用ThreadPoolExecutor,而是使用Executors类中提供的几个静态方法来创建线程池: 以下方法是Executors下的静态方法,Executors中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用
日期 2023-06-12 10:48:40002-多线程-JUC线程池-ThreadPoolExecutor运转机制详解,线程池的扩展beforeExcute,afterExcute,terminated
一、ThreadPoolExecutor理解 1.1、为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。 Java里面线程池的顶级接口是Executor,但是严格
日期 2023-06-12 10:48:40001-多线程-JUC线程池-线程池架构-Executor、ExecutorService、ThreadPoolExecutor、Executors
一、概述 1.1、线程池架构图 1. Executor 它是"执行者"接口,它是来执行任务的。准确的说,Executor提供了execute()接口来执行已提交的 Runnable 任务的对象。Executor存在的目的是提供一种将"任务提交"与"任务如何运行"分离开来的机制。 它只包含一个函数接口: void execute(Runnable command) Execu
日期 2023-06-12 10:48:40Java高并发核心编程(卷2):多线程、锁、JMM、JUC、高并发设计模式
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》
日期 2023-06-12 10:48:40阿里内部高并发核心编程笔记:多线程、锁、JMM、JUC、设计模式
前两天看到一个大佬写的博客,提到高阶开发者必须掌握的技能,其中他明确提出了“精通多线程性能调优”。 为什么多线程对开发人员如此重要? 第一,不管你去面试哪家公司,java 多线程是必问项,而且多线程使用范围广,无论如何是避不开的; 第二
日期 2023-06-12 10:48:40多线程之五(JUC+线程安全的集合类+死锁)
目录 1. JUC(java.util.concurrent)的常见类 1.1 callable 接口 1.2 Reentrantlock 1.3 Reentrantlock 和 synchronized 的区别 1.4 原子类(atomic) 1.5 线程池(ExecutorService
日期 2023-06-12 10:48:40