
Java多线程
文章平均质量分 68
小志的博客
随笔笔记,仅供参考
展开
-
如何发现死锁问题
目录一、死锁示例演示二、如何排查死锁问题一、死锁示例演示1、以最经典的哲学家吃饭的问题为场景,演示一下死锁的发生情况:示例代码package com.xz.springboottest.day1;/** * @description: * @author: xz */public class DeadLock { private static final String ACTION_ONE="拿起碗"; private static final String ACTI原创 2021-10-20 19:46:40 · 621 阅读 · 0 评论 -
synchronized关键字实现原理
目录一、synchronize关键字概述二、synchronized关键字实现原理三、为什么采用自旋而不是等待四、忙循环概述五、synchronize锁升级原理1、偏向锁为轻量级锁过程2、轻量级升级为重量级锁过程3、锁的升级的目的六、偏向锁概述七、轻量级锁概述八、重量级锁概述一、synchronize关键字概述在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized可以修饰类、方法、变量。原创 2021-12-07 21:37:04 · 1056 阅读 · 0 评论 -
线程池(ThreadPoolExecutor)源码解析
目录一、线程池概念介绍1.1、什么是线程池1.2、线程池工作流程1.3、线程池的代码用例二、源码解析——构造函数2.1、线程池的构造函数及类的继承关系2.2、Executors提供的线程池模板2.3、拒绝策略的实现2.4、任务队列BlockingQueue的实现三、 源码解析——execute(Runnable command)3.1、流程概述一、线程池概念介绍1.1、什么是线程池池化技术其实在技术生态圈中是比较常见的,比如:对象池、连接池等等。为什么会有线程池这个东西存在呢?其实原因跟其他池化技原创 2021-12-15 21:16:47 · 7900 阅读 · 2 评论 -
CompletableFuture异步编排(多任务组合)
CompletableFuture异步编排(多任务组合)原创 2022-08-23 23:37:18 · 767 阅读 · 2 评论 -
CompletableFuture异步编排(两任务组合——其中一个任务执行)
CompletableFuture异步编排(两任务组合——其中一个任务执行)原创 2022-08-23 23:31:14 · 441 阅读 · 0 评论 -
CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )
CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )原创 2022-08-23 22:54:21 · 1478 阅读 · 0 评论 -
CompletableFuture异步编排(线程串行化代码示例)
CompletableFuture异步编排(线程串行化代码示例)原创 2022-08-23 22:39:24 · 567 阅读 · 0 评论 -
CompletableFuture异步编排(handle最终处理)
CompletableFuture异步编排(handle最终处理)原创 2022-08-23 22:20:00 · 1975 阅读 · 0 评论 -
CompletableFuture异步编排(计算完成回调代码示例)
CompletableFuture异步编排(计算完成回调代码示例)原创 2022-08-23 22:11:12 · 295 阅读 · 0 评论 -
CompletableFuture异步编排(开启异步编程代码示例)
CompletableFuture异步编排(开启异步编程代码示例)原创 2022-08-21 21:38:13 · 231 阅读 · 0 评论 -
Java并发多线程编程——线程池(二)
目录一、线程池的4种拒绝策略概述1.1、线程池的拒绝策略的理解1.2、JDK内置的拒绝策略二、线程池的实际使用2.1、线程池实际中使用哪一个2.2、Executors中JDK给你提供了为什么不用?2.3、如何自定义过线程池一、线程池的4种拒绝策略概述1.1、线程池的拒绝策略的理解等待队列也已经排满了,再也塞不下新的任务了,同时线程池的max也到达了,无法接续为新任务服务。这时我们需要拒绝策略机制合理的处理这个问题。1.2、JDK内置的拒绝策略AbortPolicy(默认):直接抛出Rejec原创 2022-01-23 23:07:43 · 495 阅读 · 0 评论 -
Java并发多线程编程——线程池(一)
目录一、线程池的概述1.1、线程池的理解1.2、线程池的特点1.3、线程池的优势二、线程池的架构实现三、创建线程池的两种方式四、线程池如何使用2.1、Executors类创建线程池的5种方式2.2、Executors.newFixedThreadPool()底层源码及特点2.3、Executors.newSingleThreadExecutor()底层源码及特点2.4、Executors.newCachedThreadPool()底层源码及特点2.5、Executors类创建线程池的5种方式一、线程池的概原创 2022-01-20 22:27:35 · 937 阅读 · 0 评论 -
Java并发多线程编程——生产者消费者模式示例(阻塞队列版本)
一、生产者消费者模式示例List item示例代码输出结果如下图:原创 2022-01-18 22:57:43 · 514 阅读 · 0 评论 -
Java并发多线程编程——生产者消费者模式示例(传统版本)
一、生产者消费者模式示例代码示例需求一个初始值为0的变量 两个线程交替操作 一个加1 一个减1 每个线程遍历5轮示例代码import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 共享资源类 */class ShareData{ //一个初始值为0的变量原创 2022-01-18 22:24:34 · 485 阅读 · 0 评论 -
Java并发多线程编程——锁绑定多个条件Condition示例
一、锁绑定多个条件Condition概述ReentrantLock 用来实现分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized 要么随机唤醒一个线程,要么唤醒全部线程。二、锁绑定多个条件Condition示例代码示例需求示例需求:多线程之间按顺序调用,实现A->B->C 三个线程启动,要求如下:A线程 打印1次, B线程 打印2次, C线程 打印3次,紧接着A线程 打印1次, B线程 打印2次, C线程 打印3次,。。。。一共遍历3次原创 2022-01-18 22:18:31 · 1096 阅读 · 0 评论 -
Java并发多线程编程——锁
目录一、公平锁和非公平锁1.1、公平锁和非公平锁的概述1.2、公平锁和非公平锁的区别1.3、ReentrantLock和synchronized锁的区别二、可重入锁(又名递归锁)2.1、可重入锁的概述2.2、可重入锁的作用2.3、可重入锁的示例代码三、自旋锁(SpinLock)3.1、自旋锁(SpinLock)的概述3.2、自旋锁(SpinLock)的示例代码四、独占锁(又名写锁)和共享锁(又名读锁)4.1、独占锁和共享锁的概述4.2、独占锁和共享锁的典型应用4.3、独占锁和共享锁的示例代码一、公平锁和非原创 2022-01-13 22:30:12 · 637 阅读 · 0 评论 -
Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案
目录一、集合类HashMap线程不安全的代码示例二、集合类HashMap线程不安全的故障现象三、集合类HashMap线程不安全的原因四、集合类HashMap线程不安全的解决方案4.1、解决方式一:通过Collections工具类解决4.2、解决方式二:通过JUC包下的并发集合类解决五、ConcurrentHashMap线程安全的源码解析一、集合类HashMap线程不安全的代码示例代码import java.util.*;/** * @description: HashMap线程不安全的代码示例原创 2022-01-11 23:01:19 · 890 阅读 · 0 评论 -
Java并发多线程编程——集合类线程不安全之HashSet的示例及解决方案
目录一、集合类HashSet线程不安全的代码示例二、集合类HashSet线程不安全的故障现象三、集合类HashSet线程不安全的原因四、集合类HashSet线程不安全的解决方案4.1、解决方式一:通过Collections工具类解决4.2、解决方式二:通过JUC包下的写时复制集合类解决五、CopyOnWriteArraySet线程安全的源码解析一、集合类HashSet线程不安全的代码示例代码import java.util.*;/** * @description: HashSet线程不安全的原创 2022-01-11 22:43:34 · 1160 阅读 · 0 评论 -
Java并发多线程编程——集合类线程不安全之ArrayList的示例及解决方案
目录一、集合类线程不安全的代码示例二、集合类线程不安全的故障现象三、集合类线程不安全的原因四、集合类线程不安全的解决方案4.1、解决方式一:通过vector集合类解决(不建议)4.2、解决方式二:通过Collections工具类解决4.3、解决方式三:通过JUC包下的写时复制集合类解决五、CopyOnWriteArrayList线程安全的源码解析一、集合类线程不安全的代码示例代码import java.util.ArrayList;import java.util.UUID;/** * @d原创 2022-01-11 22:25:07 · 889 阅读 · 3 评论 -
Java并发多线程编程——原子类AtomicInteger的ABA问题及原子更新引用
目录一、ABA问题的概述二、ABA问题的产生代码示例三、原子引用类(AtomicReference)3.1、jdk1.8 API中的原子引用类截图如下:3.2、原子引用类代码示例四、ABA问题的解决4.1、ABA问题的解决思路3.2、解决ABA问题的代码示例一、ABA问题的概述CAS会导致“ABA”问题。CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当前时刻比较并替换,那么在这个时间差类会导致数据的变化。例如:一个线程 t1 从内存位置V中取出A,这个时候另一个线程 t2 也从内存中取出原创 2022-01-10 23:05:07 · 851 阅读 · 0 评论 -
Java并发多线程编程——CAS
目录一、CAS的概述二、CAS简单的代码示例三、CAS的底层原理一、CAS的概述CAS的全称为Compare-And-Swap ,它是一条CPU并发原语。CAS的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的.二、CAS简单的代码示例示例代码import java.util.concurrent.atomic.AtomicInteger;/** * @description: * @author: xz */public class CASDem原创 2022-01-10 22:10:34 · 679 阅读 · 0 评论 -
Java并发多线程编程——volatile关键字
目录一、volatile的概述1.1、volatile的理解1.2、volatile的三大特性二、JMM的概述2.1、JMM的理解2.2、JMM关于同步规定2.3、主内存和工作内存三、volatile的三大特性代码验证示例3.1、没有添加volatile关键字,不保证可见性代码示例3.2、添加volatile关键字,保证可见性代码示例3.3、添加volatile关键字,不保证原子性代码示例3.4、volatile关键字不保证原子性的原理3.5、volatile关键字不保证原子性的解决方案(不使用synchr原创 2022-01-09 22:55:09 · 694 阅读 · 0 评论 -
Java并发多线程编程——synchronized和Lock区别
目录一、synchronized和Lock区别1.1、原始构成的区别1.2、使用方法的区别1.3、等待是否可中断的区别1.4、加锁是否公平的区别1.5、锁绑定多个条件Condition的区别一、synchronized和Lock区别1.1、原始构成的区别synchronized是关键字属于JVM层面。(1)、 monitorenter 进入锁(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或同步方法中才能调用wait/notify等方原创 2022-01-06 23:05:37 · 598 阅读 · 0 评论 -
Java并发多线程编程——Semaphore
目录一、Semaphore概述二、Semaphore代码示例一、Semaphore概述Semaphore的字面意思是信号量。Semaphore主要用于两个目的:(1)、一个是用于多个共享资源的相互排斥使用。(2)、另一个用于并发资源数的控制.。二、Semaphore代码示例模拟有限个车位,多个车辆抢车位案例。代码import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;/** *原创 2022-01-06 21:37:44 · 419 阅读 · 0 评论 -
Java并发多线程编程——CyclicBarrier
一、CyclicBarrier概述CyclicBarrier的字面意思是可循环(Cyclic) 使用的屏障(barrier)。CyclicBarrier让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。二、CyclicBarrier代码示例模拟淘宝集齐5种福卡,坐等开奖案例代码import java.util.concurrent.Broke原创 2022-01-06 21:32:05 · 294 阅读 · 0 评论 -
Java并发多线程编程——CountDownLatch
目录一、CountDownLatch概述二、CountDownLatch代码示例(模拟员工下班关门案例)三、CountDownLatch代码示例(使用枚举方式模拟员工下班关门案例)一、CountDownLatch概述让一些线程阻塞直到另外一些完成后才被唤醒。CountDownLatch主要有两个方法:(1)、当一个或多个线程调用await方法时,调用线程会被阻塞.(2)、 其他线程调用countDown方法计数器减1(调用countDown方法时线程不会阻塞),当计数器的值变为0,因调用awai原创 2022-01-06 21:28:10 · 2443 阅读 · 0 评论 -
Java并发多线程编程——阻塞队列(BlockingQueue)
目录一、阻塞队列(BlockingQueue)的概述二、阻塞队列(BlockingQueue)的优点三、阻塞队列(BlockingQueue)的架构介绍四、阻塞队列(BlockingQueue)的分类五、阻塞队列(BlockingQueue)的核心方法5.1、阻塞队列的核心方法图解5.2、阻塞队列的核心方法(抛出异常示例)5.2.1 、代码示例15.2.2 、代码示例25.2.3 、代码示例35.2.4 、代码示例45.2.5 、代码示例55.3、阻塞队列的核心方法(特殊值示例)5.3.1 、代码示例15.原创 2022-01-05 23:28:29 · 1865 阅读 · 0 评论 -
sleep()方法和yield()方法的区别
目录一、yield()方法的作用二、sleep()方法和yield()方法的区别一、yield()方法的作用yield()是一个静态方法,一旦执行,它会使当前线程让出CPU。但要注意,让出CPU并不表示当前线程不执行了。当前线程在让出CPU之后,还会进行 CPU 资源的争夺,但是是否能够再次被分配到,就不一定了。因此,对Thread.yield()的调用就好像是在说:我已经完成一些最量要的工作了,我应该是可以休息一下了,可以给其他线程一些工作机会。如果你觉得一个线程不那么重要,或者优先级非常低,而原创 2021-11-17 21:15:00 · 1123 阅读 · 0 评论 -
sleep()和wait()的区别
目录一、sleep()和wait()的区别1、相同点2、不同点二、使用wait(),notify(),notifyAll()的注意事项三、wait()和notify()的工作原理一、sleep()和wait()的区别1、相同点sleep()和wait()都可以暂停线程的执行。2、不同点所在类不同sleep()是Thread类的静态方法。wait()是Object类的方法。锁释放不同sleep()是不释放锁的。wait()是释放锁的。用途不同sleep()常用于一定时间原创 2021-11-17 20:45:00 · 1704 阅读 · 0 评论 -
CAS的理解
目录1、CAS是什么2、Java中乐观锁和悲观锁是什么3、CAS存在的问题1、CAS是什么CAS(Compare And Swap),即:对值先进行比较,符合我们的预期之后再进行赋值操作。CAS是一种基于乐观锁的操作。CAS操作主要来说包含三个概念:内存位置、预期原值和待赋值的新值。如果内存地址里面的值与预期原值相同,则将该值修改为新值,否则就不会对其进行修改。所以,使用CAS的时候,是要配合无限循环来进行:“获取原值——>对比原值——>尝试赋值”的操作的。如果第一次循环发现原值不匹配原创 2021-11-17 20:30:00 · 570 阅读 · 0 评论 -
Java线程状态
目录1、Java线程6中状态2、Tread类中State枚举定义的6种状态3、各种状态的图解4、各种状态的解释1、Java线程6中状态Java线程一共分为6种状态,如下所示NEW:新建状态RUNNABLE:就绪状态BLOCKED:阻塞状态WAITING:等待状态TIMED_WAITING:限时等待状态TERMINATED:结束状态2、Tread类中State枚举定义的6种状态通过Tread中的State枚举查看这六种状态的定义,如下所示:public enum State原创 2021-11-17 20:00:00 · 180 阅读 · 0 评论 -
Java并发多线程编程——线程池的原理与使用
目录一、线程池概述1、线程池的理解2、为什么使用线程池3、线程池的优势二、ThreadPoolExecutor 类中参数认识1、ThreadPoolExecutor 类中构造参数如下图:2、ThreadPoolExecutor 类中构造参数认识3、ThreadPoolExecutor 类其他属性三、ThreadPoolExecutor 类中构造方法详解1、ThreadPoolExecutor 类构造方法源码截图2、ThreadPoolExecutor 类构造方法源码解析四、ThreadPoolExecuto原创 2021-06-21 22:55:30 · 442 阅读 · 0 评论 -
Java并发多线程编程——Executor接口
目录一、Executor接口的理解二、Executor类图结构三、Executor接口中常用的方法一、Executor接口的理解Executor属于java.util.concurrent包下;Executor是任务执行机制的核心接口;二、Executor类图结构由类图结构可知:(1)、ScheduledThreadPoolExecutor继承了ThreadPoolExecutor类并且实现了ScheduledExecutorService接口;ScheduledExecutorServ原创 2021-06-17 23:02:51 · 845 阅读 · 2 评论 -
Java并发多线程编程——Executors类
一、Executors的理解Executors类属于java.util.concurrent包;线程池的创建分为两种方式:ThreadPoolExecutor 和 Executors;Executors(静态Executor工厂)用于创建线程池;工厂和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定义的类;jdk1.8API中的解释如下:二、Executors常用的原创 2021-06-16 22:12:16 · 1550 阅读 · 13 评论 -
Java并发多线程编程——并发容器ConcurrentLinkedQueue
目录一、ConcurrentLinkedQueue的理解二、ConcurrentLinkedQueue的类图三、ConcurrentLinkedQueue类中常用的方法四、ConcurrentLinkedQueue中常用方法的原理五、单链表(Linked List)的详细理解一、ConcurrentLinkedQueue的理解ConcurrentLinkedQueue属于java.util.concurrent包;要实现一个线程安全的队列有两种实现方式:一种是加锁,这种实现方式就是我们常说的阻塞队列原创 2021-06-08 22:40:31 · 872 阅读 · 3 评论 -
Java并发多线程编程——并发容器CopyOnWriteArrayList
目录一、CopyOnWriteArrayList的理解二、CopyOnWriteArrayList的类图三、CopyOnWriteArrayList类中常用的方法四、CopyOnWriteArrayList常用方法的原理1、 add(E e)方法2、get(int index)方法3、set(int index, E element)方法4、remove(int index) 方法五、结论一、CopyOnWriteArrayList的理解CopyOnWriteArrayList属于java.util.原创 2021-06-07 22:31:03 · 395 阅读 · 2 评论 -
Java并发多线程编程——同步容器与并发容器
目录一、同步容器1、Vector——>ArrayList2、Hashtable——>HashMap3、Collections集合中——>synchronizedXXX二、并发容器1、CopyOnWriteArrayList2、ConcurrentHashMap一、同步容器1、Vector——>ArrayListvector 是线程(Thread)同步(Synchronized)的,所以它也是线程安全的;Arraylist是线程异步(ASynchronized)的,是不安全的原创 2021-06-06 22:21:48 · 535 阅读 · 12 评论 -
Java并发多线程编程——Fork/Join框架
一、Fork/Join框架的理解ForkJoinTask类属于java.util.concurrent 包下;ForkJoinTask类下有2个子类,分别为RecursiveTask和RecursiveAction类;(lz示例中使用RecursiveTask类进行重写compute()方法进行实现数值的累加计算)ForkJoinTask类 将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。二、Fork/Join框架使用示例示例场景:对数值进行原创 2021-06-06 20:30:33 · 338 阅读 · 3 评论 -
Java并发多线程编程——Callable和Runnable接口的区别
一、Callable和Runnable区别Runnable是自从java1.1就有了;而Callable是jdk1.5之后才有。Runnable接口需要实现run方法;而Callable接口需要实现call方法。实现Runnable接口的任务线程不能返回执行结果;而实现Callable接口的任务线程能返回执行结果。Runable 的run方法是被线程调用的,在run方法是异步执行的;而Callable的call方法,不是异步执行的,是由Future的run方法调用的。...原创 2021-06-06 16:58:43 · 402 阅读 · 0 评论 -
Java并发多线程编程——Future设计模式实现的示例
一、Future的理解Future接口属于 java.util.concurrent包下;Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable接口和Future接口,所以Future接口的使用与FutureTask类似;具体可参考此博文讲解的FutureTask类https://wwwxz.blog.csdn.net/article/原创 2021-06-06 16:35:57 · 566 阅读 · 1 评论