并发编程
文章平均质量分 85
关于java基础并发编程、多线程、JUC的一切
字母哥哥
百人团队技术经理。2017年度吉林省软件行业协会“最卓越程序员奖”获得者。曾就职于微软,微软MVP。华为云享专家。
展开
-
延时任务-基于netty时间轮算法实现
为了大家能够理解下文中的代码,我们先来简单了解一下netty时间轮算法的核心原理时间轮算法名副其实,时间轮就是一个环形的数据结构,类似于表盘,将时间轮分成多个bucket(比如:0-8)。假设每个时间轮轮片的分隔时间段tickDuration=1s(即:指针经过每个格子花费时间是 1 s),当前的时间bucket=3,那么在18秒后需要被执行的任务需要落到((3+18)%8=5取余运算)的5号bucket上。假如有多个需要在该时间段内执行的任务,就会组成一个双向链表。...原创 2022-08-18 18:37:53 · 783 阅读 · 0 评论 -
完整实现-通过DelayQueue实现延时任务
需要说明的是,这里的while-true循环的延时任务处理是顺序执行的,在订单并发量比较大的时候,需要考虑异步处理的方式完成订单的关闭操作。使用DelayQueue实现延时任务非常简单,而且简便,全部都是标准的JDK代码实现,不用引入第三方依赖(不依赖redis实现、消息队列实现等),非常的轻量级。BlockingQueue即阻塞队列,java提供的面向多线程安全的队列数据结构,当队列内元素数量为0的时候,试图从队列内获取元素的线程将被阻塞或者抛出异常。说明我们的实现是正确的。小概念:什么是延时任务?...原创 2022-08-17 17:25:35 · 960 阅读 · 2 评论 -
[java并发编程]基于信号量semaphore实现限流器
“信号量”在编程术语中使用单词semaphore,那什么是“信号量”?如何基于信号量实现并发限流?本文介绍原创 2022-05-17 08:05:58 · 615 阅读 · 1 评论 -
java并发编程-StampedLock高性能读写锁
最多一个线程在进行写操作(加写锁),但是同时允许多个线程进行读操作(加读锁),解决方案是StampedLock。原创 2022-05-16 08:09:04 · 545 阅读 · 2 评论 -
【java并发编程】ReentrantLock 可重入读写锁
*ReentrantReadWriteLock*类为读写锁实现类,针对某一个对象或可变变量,只要没有线程在修改它,这个对象或可变变量就可以同时被多个线程读取。ReentrantReadWriteLock将锁分为读锁和写锁,只要没有线程持有写锁的情况下,读锁可以由多个线程同时持有。...原创 2022-05-15 08:16:21 · 671 阅读 · 2 评论 -
【java并发编程】Lock & Condition 协调同步生产消费
一、协调生产/消费的需求本文内容主要想向大家介绍一下Lock结合Condition的使用方法,为了更好的理解Lock锁与Condition锁信号,我们来手写一个ArrayBlockingQueue。 JDK实际上已经有这个类,基于Lock锁与Condition锁信号实现的,当然JDK实现代码很复杂包含了更严谨的逻辑校验,以及从性能优化的角度做了更多的工作。本文中我们只是来简单实现一下其核心逻辑:ArrayBlockingQueue初始化构造时指定容量上限最大值提供put方法,当达到Queue队列容.原创 2022-05-14 09:29:08 · 733 阅读 · 1 评论 -
[并发编程]Lock锁可重入性与公平性
一、相似之处:Lock锁 vs Synchronized 代码块Lock锁是一种类似于synchronized 同步代码块的线程同步机制。从Java 5开始java.util.concurrent.locks引入了若干个Lock锁的实现类,所以通常情况下我们不需要实现自己的锁,重要的是需要知道如何使用它们,了解它们实现背后的原理。...原创 2022-05-13 08:20:05 · 632 阅读 · 1 评论 -
Java并发-volatile与JMM多线程内存模型
通过实例运行效果,介绍Java多线程内存模型JMM原创 2022-05-12 07:15:56 · 485 阅读 · 1 评论 -
并发编程之临界区\阻塞\非阻塞\死锁\饥饿\活锁
并发编程之临界区\阻塞\非阻塞\死锁\饥饿\活锁原创 2022-05-11 07:33:49 · 640 阅读 · 4 评论 -
【并发编程】结合实际需求说明ThreadLocal应用场景
结合实际需求说明ThreadLocal应用场景,和ConcurrentHashMap之间的主要区别在哪?原创 2022-03-21 07:00:00 · 2478 阅读 · 87 评论 -
【并发编程】创建并运行线程的5种方法的对比
并发编程就是基础中的基础,我的CSDN专栏《并发编程》中已经写了20篇关于java并发编程方面的文章,但我感觉这还仅仅是其中的冰山一角。这个专栏我还会继续写下去,这一篇的内容相对基础:《创建线程的四种方式》。原创 2022-03-17 08:17:48 · 3400 阅读 · 78 评论 -
在IntelliJ IDEA中多线程并发代码的调试方法
通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法。让你在多线程开发过程中的调试更加的有的放矢。我们将通过一个例子来学习。在这里,我编写了一个多线程程序来计算此数学问题:100! + 100000!。即:100的阶乘 + 100000的阶乘。数学不好的同学看这里,100 阶乘就是:1 * 2 * 3 * …… * 100 = ? ,简写为100!import java.math.BigInteger;public class MathProble原创 2020-08-05 13:16:42 · 3773 阅读 · 0 评论 -
图解进程线程、互斥锁与信号量-看完不懂你来打我
在上学的时候,老师讲到进程与线程的时候可能是这样讲的: 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单元,是应用程序运行的载体。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。那个时候为了考试我都背下来了,但是心里想说:what?这都是些什么东西? 下面让我来试着用更通俗的语言来给你说说进程、线程、.原创 2020-09-06 08:51:25 · 1143 阅读 · 0 评论 -
8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇
在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现:超过80%的图都是不完整的,或者是错的。所以我只好再次去阅读源码,然后画出下面的这张图,理解了这张图,对于大家理解java 线程的方法调用及开发过程会有很大的帮助。同步阻塞状态比较好理解,就是互斥锁,当前线程使用到的代码块,只有我用完了你才能用。延时等待状态与等待状态的主要区别在于延时等待状态不原创 2020-09-10 09:42:56 · 685 阅读 · 0 评论 -
图解并发与并行-分别从CPU和线程的角度理解
并发曾经我作为一个不是很爱学习的孩子,在上学的时候经常做这样的事情:在数学课上补物理作业,数学课听懂了,物理作业也上交了。不谦虚的说,我是具备这样的能力,但很可惜没用对地方。很多同学说:“你是不是有多个大脑?”,肯定不是啊,其实这是一种切换的能力。当你同时做多件事情,并且能够快速切换的时候。在别原创 2020-09-13 09:22:39 · 1169 阅读 · 0 评论 -
详解线程池的作用及Java中如何使用线程池
服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发、耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作。常规的方法是针对一个新的请求创建一个新线程,虽然这种方法似乎易于实现,但它有重大缺点。为每个请求创建新线程将花费更多的时间,在创建和销毁线程时花费更多的系统资源。因此同时创建太多线程的 JVM 可能会导致系统内存不足,这就需要限制要创建的线程数,也就是需要使用到线程池。一、什么是 Java 中的线程池?线程池技术就是线程的重用技术,使用之前创建.原创 2021-01-14 08:33:52 · 1343 阅读 · 0 评论 -
Java synchronized对象级别与类级别的同步锁
Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块。同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁。synchronized关键字可以作用于一个代码块一种方法当一个方法或代码块被声明为synchronized时,如果一个线程正在执行该synchronized 方法或代码块,其他线程会被阻塞,直到持有同步锁的线程释放。根据锁定的范围可以分为类级别的锁可以防止多个线程在运行时同时进入该类所有实例化对象的 synchronize.原创 2021-04-26 09:06:21 · 1051 阅读 · 0 评论 -
java并发编程工具类JUC第一篇:BlockingQueue阻塞队列
Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列。换句话说,当多线程同时从 JavaBlockingQueue中插入元素、获取元素的时候,不会导致任何并发问题(元素被插入多次、处理多次等问题)。从java BlockingQueue可以引申出一个概念:阻塞队列,是指队列本身可以阻塞线程向队列里面插入元素,或者阻塞线程从队列里面获取元素。比如:当一个线程尝试去从一个空队列里面获取元素的时候,这个线程将被阻塞直原创 2021-03-22 07:20:20 · 1794 阅读 · 1 评论 -
java并发编程工具类JUC第二篇:ArrayBlockingQueue
类ArrayBlockingQueue是BlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素。这里的“有界”是指存储容量存在上限,不能无限存储元素。在同一时间内存储容量存在着一个上限值,这个上限制在初始实例化的时候指定,之后便不能修改了。ArrayBlockingQueue内部采用FIFO (First In, First Out)先进先出的方法实现队列数据的存取,队首的元素是在队列中保存时间最长的元素对象,队尾的元素是在队列中保存时间最短的元素对象。下面的代码说明如何初原创 2021-03-23 07:34:04 · 819 阅读 · 0 评论 -
java并发编程工具类JUC第三篇:DelayQueue延时队列
DelayQueue 是BlockingQueue接口的实现类,它根据"延时时间"来确定队列内的元素的处理优先级(即根据队列元素的“延时时间”进行排序)。另一层含义是只有那些超过“延时时间”的元素才能从队列里面被拿出来进行处理。DelayQueue 队列将阻止其元素对象从队列中被取出,直到达到为元素对象设置的延迟时间。DelayQueue 在队列的头部存储最近过期的元素,如果队列内没有元素过期,使用poll()方法获取队列内的元素将会返回null。DelayQueue 类及其迭代.原创 2021-03-24 08:00:46 · 718 阅读 · 0 评论 -
java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue。LinkedBlockingQueue 队列是BlockingQueue接口的实现类,所以它具有BlockingQueue接口的一切功能特点。LinkedBlockingQueue队列 按照first-in-first-out (FIFO)先进先出的方式对元素进行排序。LinkeBlockingQueue 提供了两种构造函数,一个构造函数构造一个队列容量为固定.原创 2021-03-25 07:45:26 · 869 阅读 · 0 评论 -
java并发编程工具类JUC第五篇:PriorityBlockingQueue优先级队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue,本文为系列文章第五篇。Java PriorityBlockingQueue队列是BlockingQueue接口的实现类,它根据priority优先级确定队列内元素对象的处理顺序,也就是说在一个PriorityBlockingQueue队列中,被添加到队列中的元素,根据priority进行排序。PriorityBlocki.原创 2021-03-26 07:12:34 · 813 阅读 · 0 评论 -
java并发编程工具类JUC第六篇:SynchronousQueue同步队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue,本文为系列文章第六篇。本篇文章将为大家介绍并发编程集合类SynchronousQueue,它是BlockingQueue接口的实现类。与所有的BlockingQueue接口实现类不同的是:SynchronousQueue队列的容量永远是0(或者可以理解为容量为1的队列,但是说队.原创 2021-03-27 08:54:14 · 713 阅读 · 0 评论 -
java并发编程工具类JUC第七篇:BlockingDeque双端阻塞队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue,本文为系列文章第七篇。BlockingDeque接口和BlockingQueue 接口一样都是在java.util.concurrent中定义的,它代表了一个线程安全的“双端队列”,以线程安全的方式向队列中添加元素或获取元素。本篇文章将带大家进.原创 2021-03-29 07:08:54 · 724 阅读 · 0 评论 -
java并发编程工具类JUC第八篇:ConcurrentHashMap
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque接口,本文为系列文章第八篇。由于Java程序员常用的HashMap的操作方法不是同步的,所以在多线程环境下会导致存取操作数据不一致的问题,Map接口的另一个实现类Hashtable 虽然是线程安全的,但是在多线程下执行.原创 2021-03-30 06:07:22 · 1206 阅读 · 0 评论 -
java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque接口、ConcurrentHashMap,本文为系列文章第九篇。CountDownLatch是一种线程同步辅助工具,它允许一个或多个线程等待其他线程正在执行的一组操作完成。CountDownLatch的概念在java并.原创 2021-03-31 07:26:59 · 679 阅读 · 0 评论 -
java并发编程JUC第十篇:CyclicBarrier线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque接口、ConcurrentHashMap、CountDownLatch,本文为系列文章第十篇。java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障.原创 2021-04-01 07:26:39 · 647 阅读 · 0 评论 -
java并发编程JUC第十一篇:如何在线程之间进行对等数据交换
java.util.concurrent.Exchanger可以用来进行数据交换,或者被称为“数据交换器”。两个线程可以使用Exchanger交换数据,下图用来说明Exchanger的作用在下面的代码中首先我们定义了一个Exchanger,用于数据交换然后定义了两个线程对象bookExchanger1和bookExchanger2,两个线程都持有Exchanger交换器对象用于数据交换两个线程中的每个线程都有自己的数据,比如下面代码中的String[] 书籍数组。public stati.原创 2021-04-06 07:38:35 · 674 阅读 · 0 评论 -
java并发编程JUC第十二篇:AtomicInteger原子整型
AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1.5开始引入。1. AtomicInteger基础用法通过下文的AtomicInteger构造方法,可以创建一个AtomicInteger对象,该对象的初始值默认为0。AtomicInteger提供get和set方法,获取底层int整数值,与设置int整数值//初始值为0的atomicInteger对.原创 2021-04-08 07:29:58 · 1468 阅读 · 0 评论 -
【java基础】子线程任务发生异常,主线程事务如何回滚?
主线程向线程池提交了一个任务,如果执行这个任务过程中发生了异常,如何让主线程捕获到该异常并且进行事务的回滚原创 2022-03-09 10:51:24 · 8279 阅读 · 71 评论