【Java并发编程】
文章平均质量分 90
Java并发编程
小小工匠
show me the code ,change the world
展开
-
Spring Cloud Alibaba - 利用Nacos实现高效动态线程池管理
随着现代应用程序的复杂性不断增加,动态线程池管理成为了构建可靠和高效系统的关键之一。而Nacos作为一个优秀的服务发现和配置中心,能够帮助我们实现动态线程池的灵活管理。我们这里将介绍如何利用Nacos来实现高效的动态线程池管理,并探讨其在分布式系统中的应用。在软件开发中,线程池是一种管理和重用线程的机制,它能够有效地控制并发执行的线程数量,避免资源耗尽和性能下降。动态线程池则是在传统线程池的基础上,能够根据系统负载和资源需求动态调整线程数量的一种改进型线程池管理方式。原创 2024-02-25 22:06:51 · 1714 阅读 · 0 评论 -
并发编程 - CompletableFuture
常见的线程创建方式有两种,一是直接继承Thread,另一种是实现Runnable接口。但这两种方式有个缺点,不支持获取线程执行结果。所以在JDK1.5之后,提供了Callable和Future,可以在任务执行后获取执行结果。是一个实现了 Java 8 中接口的类,它代表一个异步计算的结果。它提供了异步编程的能力,可以让开发者在编写代码时更加方便地处理异步操作。CompletableFuture具有以下主要特征:异步编程能力可以通过等方法异步执行任务,不会阻塞当前线程。组合式编程支持。原创 2023-07-30 22:35:10 · 6921 阅读 · 0 评论 -
每日一博 - Java 异步编程的 Promise 模式 CompletableFuture的前世今生 (上)
在 Java 中,在 JDK 1.8 里也引入了类似 JavaScript 的玩法 —— CompletableFuture。这个类提供了大量的异步编程中 Promise 的各种方式。原创 2023-03-19 11:28:54 · 19960 阅读 · 0 评论 -
Arch - 多线程设计架构模式
多线程设计架构模式是一种通过合理地使用线程来提高系统性能和响应能力的设计模式。以下是一些常见的多线程设计架构模式:线程池模式:通过预先创建一组线程,将任务提交到线程池中执行,避免了线程的频繁创建和销毁,提高了系统的性能和稳定性。生产者-消费者模式:通过将任务分为生产者和消费者两个角色,生产者负责生成任务并将其放入队列中,而消费者则从队列中获取任务并执行。这种模式可以提高系统的并发性能和吞吐量。Future模式:通过使用Future对象来表示异步计算的结果,可以让调用方在不阻塞的情况下获取到计算结果。原创 2023-07-17 20:15:00 · 7946 阅读 · 0 评论 -
并发编程 - 利用Event Bus模式实现目录文件变化捕捉
JDK自1.7版本后提供了WatchService类,该类可以基于事件通知的方式监控文件或者目录的任何变化,文件的改变相当于每一个事件(Event)的发生,针对不同的时间执行不同的动作,我们将结合NIO2.0中提供的WatchService和上一篇博文实现的Event Bus实现文件目录的监控的功能。在子目录下不断地创建、删除、修改文件,这些事件都将被收集并且提交给EventBus。原创 2023-07-09 18:30:38 · 9067 阅读 · 0 评论 -
并发编程 - Event Bus 设计模式
注册对象给Event Bus的时候需要指定接收消息时的回调方法,采用注解的方式进行Event回调/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/**原创 2023-07-09 13:46:16 · 9194 阅读 · 0 评论 -
并发编程 - 通过 Disruptor 来实现无锁无阻塞的并发编程
Disruptor是一种高性能的并发编程框架,它由LMAX Exchange公司开发,并于2011年开源。Disruptor旨在解决传统多线程编程中的性能瓶颈和并发问题,特别适用于需要高度并发处理的场景。Disruptor采用了一种称为"无锁编程"的机制,通过使用环形缓冲区(Ring Buffer)和事件驱动的方式实现高效的消息传递和处理。它的核心思想是将消息(事件)在生产者和消费者之间进行无锁的、高效的交换,以减少线程间的竞争和上下文切换。原创 2023-07-04 18:59:58 · 9129 阅读 · 0 评论 -
Java Review - Java进程内部的消息中间件_Event Bus设计模式
文章目录概述概述在工作中,我们都会使用到MQ 比如 Apache Kafka等,某subscriber在消息中间件上注册了某个topic(主题),当有消息发送到了该topic上之后,注册在该topic上的所有subscriber都将会收到消息 。消息中间件提供了系统之间的异步处理机制。 主业务完成后即可向用户返回成功的通知,然后提交各种消息至消息中间件,这样注册在消息中间件的其他系统就可以顺利地接收通知了,然后执行各自的业务逻辑。消息中间件主要用于解决进程之间消息异步处理的解决方案,这里,我们原创 2021-12-19 08:59:43 · 30878 阅读 · 3 评论 -
高并发编程-重排序
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。原创 2019-10-31 00:33:28 · 6864 阅读 · 0 评论 -
高并发编程-happens-before
文章目录概述happens-before定义happens-before规则happens-before与JMM的关系JMM的设计概述happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键从JDK 5开始,Java使用新的JSR-133内存模型。JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一...原创 2019-10-31 00:00:35 · 6811 阅读 · 0 评论 -
高并发编程-重新认识Java内存模型(JMM)
文章目录从CPU到内存模型内存模型如何确保缓存一致性并发变成需要解决的问题 (原子性、可见性、有序性)内存模型需要解决的问题Java内存模型JMM的API实现原子性 synchronized可见性 volatile 、 synchronized 、 final有序性 synchronized 、volatile从CPU到内存模型高并发编程-通过volatile重新认识CPU缓存 和 Ja...原创 2019-10-30 16:32:38 · 6705 阅读 · 2 评论 -
高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)
文章目录概述例子概述这里我们逐步的揭开volatile的面纱我们知道,在多线程并发编程中synchronized和volatile都扮演着重要的角色。 volatile是轻量级的 synchronized,它在高并发中保证了共享变量的“可见性”。那什么是可见性呢?可见性 我们可以理解为:当一个线修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰的...原创 2019-10-29 15:26:51 · 7270 阅读 · 0 评论 -
高并发编程-Wait Set 多线程的“休息室”
文章目录概述关于wait set概述官方指导: https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html或者:https://learning.oreilly.com/library/view/the-java-language/9780133260335/ch17lev1sec2.html关于wait setEve...原创 2019-10-27 18:30:30 · 7125 阅读 · 0 评论 -
高并发编程-自定义简易的线程池(2),体会原理
文章目录概述示例概述高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来拒绝策略关闭线程池最小 最大 活动线程数…示例比较简单,直接上代码,见注释package com.artisan.test;import java.util.ArrayList;import java.util.Iterator;import ja...原创 2019-10-26 00:48:02 · 6827 阅读 · 0 评论 -
高并发编程-自定义简易的线程池(1),体会原理
文章目录概述概述我们工作中,并发编程必然离不开jdk提供的j.u.c中的线程池 ,假设让我们自己去设计一个线程池,该从哪几个方面来着手考虑呢?首先: 既然是线程池 , 那必然 有个初始化的线程数量 和 最大数量 ----> 两个属性 : init 和 max 其次:当线程池中的线程达到了 init 数量,但还没到max 数量的时候,将任务放入任务队列中,而不是直接开辟新的线程...原创 2019-10-19 00:14:20 · 6744 阅读 · 0 评论 -
高并发编程-捕获线程运行时的异常 + 获取调用链
文章目录概述捕获线程运行时的异常使用场景UncaughtExceptionHandler 接口示例获取调用链概述捕获线程运行时的异常我们看下Thread的定义 实现了Runnable接口重写了run方法根据方法签名可知,run方法是不能向上层抛出异常的,如果线程内部产生异常, 不catch的情况下,上层调用代码如何知道呢?使用场景为啥需要这样做呢?一个线程抛出异常之后,...原创 2019-10-18 16:47:18 · 6979 阅读 · 0 评论 -
高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook
文章目录概述使用场景注意事项示例概述一句话概括就是: ShutdownHook允许开发人员在JVM关闭时执行相关的代码。我们可以使用java.lang.Runtime.getRuntime().addShutdownHook(Thread t)方法在JVM中添加关闭钩子。使用场景1.程序正常退出 , JVM关闭2. 调用System.exit ,JVM关闭3. 程序抛出异常,导致...原创 2019-10-16 22:46:00 · 8840 阅读 · 0 评论 -
高并发编程-自定义带有超时功能的锁
文章目录概述步骤自定义超时异常处理类ILock接口实现类测试存在的问题修复存在的问题超时功能测试超时功能概述我们知道synchronized的机制有一个很重要的特点是:使用synchronized, 当一个线程获取了锁,其他线程只能一直等待,等待这个获取锁的线程释放锁,如果这个线程执行时间很长,其他线程就需要一直等待 。 除非获取锁的线程执行完了该代码块,释放锁或者线程执行发生异常,JVM...原创 2019-10-13 23:07:43 · 7053 阅读 · 0 评论 -
高并发编程-线程生产者消费者的综合示例
文章目录需求实现需求需求: 假设有10个线程,最多同时运行5个要求: 不使用线程池,使用synchronized-wait¬ifyAll机制实现详见注释package com.artisan.test;import java.time.LocalTime;import java.util.*;/** * 需求: 假设有10个线程,最多同时运行5个 * 要求...原创 2019-10-12 01:00:23 · 6795 阅读 · 1 评论 -
高并发编程-Daemon Thread的创建以及使用场景分析
文章目录官方文档Daemon Thread VS User ThreadDaemon thread的特点方法void setDaemon(boolean status)boolean isDaemon()Exceptions in Daemon thread例子使用场景分析官方文档我们以JAVA8的doc为例 戳这里Daemon Thread VS User ThreadJava提...原创 2019-09-17 00:36:42 · 9625 阅读 · 0 评论 -
并发编程-26 高并发处理手段之服务降级与服务熔断 + 数据库切库分库分表
文章目录服务降级与服务熔断概述服务降级举例服务熔断 VS 服务降级服务降级要考虑的问题Hystrix数据库切库分库分表高可用的一些手段服务降级与服务熔断概述服务熔断: 一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,熔断也可以称为过载保护服务降级: 当服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此缓解服务器...原创 2019-03-10 20:28:20 · 8363 阅读 · 0 评论 -
并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
文章目录概述消息队列消息队列特性为什么需要消息队列消息队列的好处消息队列举例应用拆分应用拆分的原则应用拆分的思考应用拆分常用的组件DubboSpring Cloud应用限流限流算法 -- 计数器法 ,简单但是有临界问题限流算法 -- 滑动窗口 (Rolling Window),划分多个时间窗口解决临界问题限流算法 -- 漏桶(Leaky Bucket)限流算法 -- 令牌桶(Token Bucke...原创 2019-03-10 00:32:46 · 8978 阅读 · 4 评论 -
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
文章目录概述扩容思路垂直扩展(纵向扩展)水平扩展(横向扩展)缓存思路缓存特征缓存命中率影响因素缓存分类和应用场景Guava CacheMemcacheRedis概述这里只是讲通用的思路,而不会涉及具体的代码,实际高并发的场景需要根据实际情况来决定方案。扩容思路举个例子: 一共有60块砖, 1个工人。每次只能搬运10块。每次搬运耗时10分钟,这样的话,1个工人搬运完60块砖,就需要1个小...原创 2019-03-06 00:47:09 · 8810 阅读 · 0 评论 -
并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
文章目录概述阻塞队列的常用场景阻塞队列的4种处理方式JDK 7提供的7个阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueDelayQueueSynchronousQueueLinkedTransferQueueLinkedBlockingDeque概述阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。...原创 2019-03-05 00:14:51 · 7234 阅读 · 0 评论 -
并发编程-22J.U.C组件拓展之Fork/Join框架
文章目录Fork/Join框架概述工作窃取算法优点缺点Fork/Join框架的设计ForkJoinTaskForkJoinPool示例Fork/Join框架的异常处理代码Fork/Join框架概述Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork就是把一个大任务切分为若干子任务并行的执...原创 2019-03-04 00:04:06 · 8463 阅读 · 0 评论 -
并发编程-21J.U.C组件拓展之Future和FutureTask
文章目录概述FutureTask的三种运行状态FutureTask的三种运行状态下的get/cancel操作及结果FutureTask的实现FutureTask的使用示例FutureFutureTask代码概述Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTa...原创 2019-03-03 22:40:16 · 8035 阅读 · 3 评论 -
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
文章目录J.U.C脑图ReentrantLock概述ReentrantLock 常用方法synchronized 和 ReentrantLock的比较ReentrantLock示例读写锁ReentrantReadWriteLock例子StempedLock示例Condition示例代码J.U.C脑图ReentrantLock概述重入锁ReentrantLock,顾名思义,就是支持重...原创 2019-02-27 23:49:51 · 8727 阅读 · 0 评论 -
并发编程-18AQS同步组件之 CyclicBarrier 同步屏障
文章目录J.U.C脑图CyclicBarrierCyclicBarrier的应用场景示例awaitawait(long timeout, TimeUnit unit)CyclicBarrier(int parties, Runnable barrierAction)CyclicBarrier和CountDownLatch的区别代码J.U.C脑图CyclicBarrierCyclicB...原创 2019-02-24 23:29:31 · 8649 阅读 · 4 评论 -
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
文章目录J.U.C脑图Semaphore 概述Semaphore 构造函数及方法构造函数常用和需要注意的方法Semaphore 示例J.U.C脑图Semaphore 概述Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。举个例子:高速要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须 在路口等待,所以前一百...原创 2019-02-24 23:29:09 · 8651 阅读 · 1 评论 -
并发编程-16AQS同步组件之CountDownLatch 闭锁
文章目录脑图CountDownLatch闭锁示例Thread#join()CountDownLatchCountDownLatch示例二 await一直等待其他线程执行完CountDownLatch示例三 await指定等待时间小结代码脑图CountDownLatch闭锁Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器...原创 2019-02-24 23:28:35 · 8533 阅读 · 3 评论 -
并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
文章目录J.U.C脑图J.U.C核心AQS简介AQS底层数据结构AQS特点AQS同步组件之 CountDownLatch 闭锁AQS同步组件之 Semaphore 信号量AQS同步组件之 CyclicBarrier 同步屏障AQS同步组件之 ReentrantLock与锁J.U.C脑图为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了。J.U.C的构成如下:J.U...原创 2019-02-24 23:27:54 · 8894 阅读 · 2 评论 -
并发编程-14线程安全策略之并发容器(J.U.C)中的集合类
文章目录J.U.C总览脑图概述并发容器特性示例ArrayList对应的线程安全的并发容器类CopyOnWriteArrayList (线程安全)HashSet对应的线程安全的并发容器类CopyOnWriteArraySet (线程安全)TreeSet对应的线程安全的并发容器类 ConcurrentSkipListSet (线程安全)TreeMap对应的线程安全的并发容器类ConcurrentSk...原创 2019-02-24 23:26:58 · 8633 阅读 · 0 评论 -
并发编程-13线程安全策略之两种类型的同步容器
文章目录脑图概述同步容器集合接口下的同步容器实现类Vector (线程安全性比ArrayList好一些,但并非绝对线程安全)同步容器 线程不安全的场景其他注意事项HashtableCollections.synchronizedXXX方法所创建的同步容器Collections.synchronizedListCollections.synchronizedMapCollections.synchr...原创 2019-02-23 23:49:36 · 8747 阅读 · 1 评论 -
并发编程-12线程安全策略之常见的线程不安全类
文章目录脑图概述字符串拼接子之StringBuilder、StringBufferStringBuilder (线程不安全)StringBuffer (线程安全)小结时间相关的类 SimpleDateFormat、第三方库joda-time、JDK8提供的类SimpleDateFormat (线程不安全的写法)SimpleDateFormat (线程安全的写法-堆栈封闭)joda-time (线程...原创 2019-02-23 01:48:51 · 8900 阅读 · 0 评论 -
并发编程-11线程安全策略之线程封闭
文章目录脑图概述线程封闭的三种方式示例堆栈封闭ThreadLocalStep1. ThreadLocal操作类Step2. 自定义过滤器Step3. 注册拦截器,配置拦截规则Step4. Controller层调用Step5. 测试代码脑图概述在上篇博文并发编程-10线程安全策略之不可变对象 ,我们通过介绍使用线程安全的不可变对象可以保证线程安全。除了上述方法,还有一种办法就是:线程封...原创 2019-02-23 00:11:10 · 9615 阅读 · 2 评论 -
并发编程-10线程安全策略之不可变对象
文章目录四个线程安全策略不可变对象定义不可变对象需要满足的条件如何创建不可变对象使用final关键字定义不可变对象修饰变量示例final 修饰基本数据类型及String: 初始化之后不能修改 (线程安全)final修饰引用类型变量:初始化之后不能再修改其引用,但可以修改值 (线程不安全)使用JDK / Guava中提供的工具类创建不可变对象的Collections.unmodifiableX...原创 2019-02-22 00:09:32 · 8760 阅读 · 0 评论 -
并发编程-09安全发布对象+单例模式详解
文章目录概述安全发布对象的4种方式示例懒汉模式(线程不安全)饿汉模式 静态域(线程安全)改造线程不安全的懒汉模式方式一 静态方法使用synchronized修饰 (线程安全)改造线程不安全的懒汉模式方式二双重检查机制(线程不安全)改造线程不安全的懒汉模式方式二双重检查机制优化-volatile + 双重检测机制 (线程安全)饿汉模式的第二种写法 静态代码块 (线程安全)饿汉模式的第三种写法 静...原创 2019-02-21 01:29:38 · 9036 阅读 · 0 评论 -
并发编程-08安全发布对象之发布与逸出
文章目录概念示例不安全的发布对象Demo对象逸出Demo小结代码概念发布对象: 使一个对象能够被当前范围之外的代码所使用,日常开发中比较常见的比如通过类的非私有方法返回对象的引用,或者通过公有的静态变量发布对象 等都属于发布对象对象逸出: 首先需要明确的是对象逸出是一种错误的发布方式。 当一个对象还没有构造完成时,就使它被其他线程所见。示例不安全的发布对象Demopackage co...原创 2019-02-20 23:35:59 · 8805 阅读 · 0 评论 -
并发编程-06线程安全性之可见性 (synchronized + volatile)
文章目录可见性定义导致不可见的原因可见性 -synchronized (既保证原子性又保证可见性)可见性 - volatile(但不保证操作的原子性)volatile变量 写操作volatile变量 读操作使用volatile尝试解决计数并发错误的问题 【volatile无法解决该问题】volatile使用场景synchronized和volatile的比较可见性定义一个线程对共享变量值的修改...原创 2019-02-17 23:48:15 · 9015 阅读 · 0 评论 -
并发编程-05线程安全性之原子性【锁之synchronized】
文章目录脑图概述原子性synchronized 修饰的4种对象修饰代码块作用范围及作用对象Demo多线程下 同一对象的调用多线程下不同对象的调用修饰方法作用范围及作用对象Demo多线程下同一个对象的调用多线程下不同对象的调用修饰静态方法作用范围及作用对象Demo多线程同一个对象的调用多线程下不同对象的调用修饰类作用范围及作用对象Demo多线程下同一对象的调用多线程下不同对象的调用使用Synchro...原创 2019-02-17 23:46:31 · 9008 阅读 · 0 评论