
【Java并发编程】
文章平均质量分 93
Java并发编程
小小工匠
show me the code ,change the world
展开
-
J.U.C Review - ThreadLocal原理源码分析
在多线程或分布式系统中,数据一致性问题通常发生在多个主体(如线程或服务器节点)试图对同一份数据进行访问和修改时。这时,如果没有合理的机制来协调这些操作,就可能导致数据不一致的情况。数据一致性问题的关键在于多个主体无法就数据的状态达成一致意见。是 Java 中用于创建线程局部变量的类。通过 ThreadLocal,每个线程都可以拥有自己独立的变量副本,这些副本在多个线程之间是彼此隔离的。这样,每个线程对该变量的操作不会影响到其他线程,避免了线程间共享数据引发的一致性问题。原创 2024-09-07 11:45:00 · 4134 阅读 · 0 评论 -
J.U.C Review - 计划任务ScheduledThreadPoolExecutor源码分析
/ delay时长后执行任务command,该任务只执行一次// 这里的decorateTask方法仅仅返回第二个参数// 延时或者周期执行任务的主要方法,稍后统一说明return t;我们先看看里面涉及到的几个类和接口的关系:内部使用优化的DelayQueue来实现,由于使用队列来实现定时器,有出入队调整堆等操作,所以定时并不是非常非常精确。原创 2024-09-07 07:45:00 · 4187 阅读 · 0 评论 -
J.U.C Review - Stream并行计算原理源码分析
自Java 8推出以来,开发者可以使用Stream接口和lambda表达式实现流式计算。这种编程风格不仅简化了对集合操作的代码,还提高了代码的可读性和性能。Stream接口提供了多种集合操作方法,包括empty(判空)、filter(过滤)、max(求最大值)、findFirst和findAny(查找操作)等,使得对集合的操作更加灵活和直观。原创 2024-09-06 22:30:00 · 3837 阅读 · 0 评论 -
J.U.C Review - Fork/Join框架
Fork/Join框架是Java中用于并行计算的一个强大工具,它实现了接口,专为能够通过递归分解成更小任务的问题而设计。这个框架的设计初衷是为了充分利用多核处理器的计算能力,从而提高应用程序的整体性能。原创 2024-09-06 20:45:00 · 3863 阅读 · 0 评论 -
J.U.C Review - 常见的通信工具类解析
Java 的包提供了许多实用的工具类,用于简化并发编程。这些工具类帮助开发者管理和协调多线程操作,从而避免手动实现复杂的同步机制。类作用Semaphore限制同时访问某个资源的线程数量Exchanger两个线程间交换数据使一个或多个线程等待,直到其他线程完成任务后再继续执行使一组线程在某个屏障点同步,屏障可以被重复使用Phaser更加灵活的同步工具,支持多阶段任务同步,类似但更强大于CyclicBarrier。原创 2024-09-06 05:45:00 · 3852 阅读 · 0 评论 -
J.U.C Review - CopyOnWrite容器
CopyOnWrite容器是一种实现了写时复制(Copy-On-Write,COW)机制的并发容器。在并发场景中,多个线程可能同时访问同一资源,当某个线程需要修改数据时,系统会创建该数据的副本供其修改,而其他线程仍然可以访问原始数据。这种机制的主要优点是可以在读操作频繁的情况下,避免加锁,从而提高读取性能。和。这两个容器的设计使得在“读多写少”的场景下,能够有效地提高并发性能。原创 2024-09-05 22:45:00 · 3919 阅读 · 0 评论 -
J.U.C Review - 并发容器集合解析
接口扩展了Map:在指定键的值不存在时,插入给定值,避免了在多线程环境下的竞争条件。例如,在实现一个缓存时,可以使用这个方法确保在多个线程尝试同时插入相同键时,只有第一个线程的插入操作生效,其他线程则会获取已经存在的值。:只有在键值对匹配时才会移除元素,这是对方法的扩展,确保了在多线程环境下的精确控制。:只有在键与旧值匹配时才会替换值,这使得我们可以确保替换操作仅在我们预期的情况下发生。:直接替换指定键的值,但前提是该键存在。这些方法通过原子操作,确保了在多线程环境下的安全性和一致性。原创 2024-09-05 06:15:00 · 4426 阅读 · 0 评论 -
J.U.C Review - 并发包下常见的锁接口和类
是 Java 8 引入的一个新的锁机制,用于优化读写锁的性能。它设计的目的是为了减少读操作和写操作之间的竞争,提高并发性能。与传统的在功能和性能上有所不同。原创 2024-09-04 21:30:00 · 3920 阅读 · 0 评论 -
J.U.C Review - 阻塞队列原理/源码分析
假设一种典型场景:有一个生产者不断地生产资源,消费者不断地消费资源,所有的资源被存储在一个共享的缓冲池中。操作通过相应的条件变量,阻塞等待与唤醒操作,使生产者和消费者线程能够有效地协作,从而实现线程间的同步与资源共享。是一个特殊的阻塞队列,队列中的元素只有在指定的延迟时间到期后,才能从队列中获取到。在这种模式中,生产者将数据添加到队列中,消费者从队列中取出数据。是一个无界队列,插入操作永远不会被阻塞,但获取操作会在没有到期元素时被阻塞。使用阻塞队列可以有效地管理任务的执行,实现线程池的负载均衡和任务调度。原创 2024-09-04 06:45:00 · 4089 阅读 · 0 评论 -
J.U.C Review - 线程池原理/源码解析
通过管理核心线程和非核心线程的数量、维护阻塞队列中的任务、处理线程池的状态变化,从而高效地管理并发任务的执行,并实现线程的复用,避免频繁的线程创建和销毁。线程池本身有一个调度线程,这个线程就是用于管理布控整个线程池里的各种任务和事务,例如创建线程、销毁线程、任务队列管理、线程队列管理等等。状态,线程池不能接受新的任务,中断所有线程,阻塞队列中没有被执行的任务全部丢弃。当然,核心线程池中创建的线程想要拿到阻塞队列中的任务,先要判断线程池的状态,如果。在构造方法中,创建了一个线程,线程的任务就是自己。原创 2024-09-03 21:15:00 · 4287 阅读 · 0 评论 -
J.U.C Review - AQS核心方法解析
AQS)是一个用来构建锁和同步器的框架。抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现;队列:使用先进先出(FIFO)队列存储数据;同步:实现了同步的功能。它是一个抽象类,提供了构建同步器的基础功能,子类可以通过实现一些关键的protected方法来创建自定义的同步器。SemaphoreFutureTask通过AQS,开发者能够高效地构建各种同步器,满足不同的需求。原创 2024-09-03 06:15:00 · 4587 阅读 · 0 评论 -
J.U.C Review - CAS的工作原理
乐观锁常通过CAS(Compare And Swap,比较并交换)机制来实现,CAS是一种硬件支持的原子操作,保证了即使在多线程环境下,也能安全地执行检查并更新操作。:悲观锁适用于“写多读少”的场景,尤其是在高并发环境下,频繁的写操作容易引发冲突,此时使用悲观锁可以有效避免冲突,保障数据的一致性。:乐观锁适用于“读多写少”的场景,这种情况下,资源访问的冲突概率较低,使用乐观锁可以减少锁带来的开销,提高系统性能。的弱版本,它的执行更轻量级,但在一些情况下可能会失败,而不一定遵循严格的内存顺序。原创 2024-09-02 12:45:00 · 4488 阅读 · 0 评论 -
J.U.C Review - volatile / synchronized / 锁 深入剖析
volatile关键字通过确保内存可见性和禁止指令重排序,为Java并发编程提供了一个轻量级的同步机制。它在性能和功能之间提供了一个平衡:虽然不能像锁那样保证复杂的原子性操作,但在需要简洁、高效的内存同步时,volatile是一个非常有用的工具。原创 2024-09-02 06:15:00 · 4164 阅读 · 0 评论 -
J.U.C Review - 白话Java内存模型
指令重排序是计算机执行程序时,为提高性能而对指令执行顺序进行调整的一种优化手段。这种优化在单线程中不会改变程序的语义,但在多线程环境中可能导致不一致的内存可见性。是JMM用于描述操作之间内存可见性关系的概念。如果操作A happens-before操作B,则A的结果对B可见,并且A的执行顺序在B之前。JMM通过happens-before规则来为多线程编程提供内存可见性的保证,确保正确同步的多线程程序执行结果不被重排序所改变。原创 2024-09-01 20:20:12 · 4195 阅读 · 0 评论 -
J.U.C Review - Java线程间的通信
使当前线程等待调用此方法的线程终止,最长等待时间由millis参数指定,单位为毫秒。: 除了接受一个毫秒数外,还接受一个额外的纳秒数(范围在0到999999之间),用于更细粒度的时间控制。但需注意,这个纳秒参数并不能保证绝对的精度。如果希望在子线程中修改继承的值或进行特殊处理,可以通过重写的方法来定制子线程的值。@Override// 创建一个 InheritableThreadLocal 对象,用于在不同线程之间传递字符串值@Override/*** 程序的入口点。原创 2024-08-30 21:45:00 · 7596 阅读 · 0 评论 -
J.U.C Review - 线程的状态及主要转化方法
测试方法的main线程只保证了a,b两个线程调用start()方法(转化为RUNNABLE状态),如果CPU执行效率高一点,还没等两个线程真正开始争夺锁,就已经打印此时两个线程的状态(RUNNABLE)了。在线程中断机制里,当其他线程通知需要被中断的线程后,线程中断的状态被设置为true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己而定,可以在合适的实际处理中断请求,也可以完全不处理继续执行下去。就在小王等得有点不耐烦的时候,他接到了老板的电话,要求他先不要吃饭,等老板来食堂一起吃。原创 2024-08-28 06:11:20 · 4077 阅读 · 0 评论 -
J.U.C Review - 基本概念:进程、线程、线程组、优先级
在Java中,我们可以通过继承Thread类或实现Runnable接口来创建线程。虽然Thread类使用起来简单,但Runnable接口更加灵活,更符合面向对象设计原则。当需要线程有返回值时,可以使用Callable接口,而Future接口和FutureTask类提供了获取异步任务结果的机制。原创 2024-08-27 23:00:56 · 4173 阅读 · 0 评论 -
Spring Cloud Alibaba - 利用Nacos实现高效动态线程池管理
随着现代应用程序的复杂性不断增加,动态线程池管理成为了构建可靠和高效系统的关键之一。而Nacos作为一个优秀的服务发现和配置中心,能够帮助我们实现动态线程池的灵活管理。我们这里将介绍如何利用Nacos来实现高效的动态线程池管理,并探讨其在分布式系统中的应用。在软件开发中,线程池是一种管理和重用线程的机制,它能够有效地控制并发执行的线程数量,避免资源耗尽和性能下降。动态线程池则是在传统线程池的基础上,能够根据系统负载和资源需求动态调整线程数量的一种改进型线程池管理方式。原创 2024-02-25 22:06:51 · 6695 阅读 · 0 评论 -
并发编程 - CompletableFuture
常见的线程创建方式有两种,一是直接继承Thread,另一种是实现Runnable接口。但这两种方式有个缺点,不支持获取线程执行结果。所以在JDK1.5之后,提供了Callable和Future,可以在任务执行后获取执行结果。是一个实现了 Java 8 中接口的类,它代表一个异步计算的结果。它提供了异步编程的能力,可以让开发者在编写代码时更加方便地处理异步操作。CompletableFuture具有以下主要特征:异步编程能力可以通过等方法异步执行任务,不会阻塞当前线程。组合式编程支持。原创 2023-07-30 22:35:10 · 11389 阅读 · 0 评论 -
每日一博 - Java 异步编程的 Promise 模式 CompletableFuture的前世今生 (上)
在 Java 中,在 JDK 1.8 里也引入了类似 JavaScript 的玩法 —— CompletableFuture。这个类提供了大量的异步编程中 Promise 的各种方式。原创 2023-03-19 11:28:54 · 24791 阅读 · 0 评论 -
Arch - 多线程设计架构模式
多线程设计架构模式是一种通过合理地使用线程来提高系统性能和响应能力的设计模式。以下是一些常见的多线程设计架构模式:线程池模式:通过预先创建一组线程,将任务提交到线程池中执行,避免了线程的频繁创建和销毁,提高了系统的性能和稳定性。生产者-消费者模式:通过将任务分为生产者和消费者两个角色,生产者负责生成任务并将其放入队列中,而消费者则从队列中获取任务并执行。这种模式可以提高系统的并发性能和吞吐量。Future模式:通过使用Future对象来表示异步计算的结果,可以让调用方在不阻塞的情况下获取到计算结果。原创 2023-07-17 20:15:00 · 12439 阅读 · 0 评论 -
并发编程 - 利用Event Bus模式实现目录文件变化捕捉
JDK自1.7版本后提供了WatchService类,该类可以基于事件通知的方式监控文件或者目录的任何变化,文件的改变相当于每一个事件(Event)的发生,针对不同的时间执行不同的动作,我们将结合NIO2.0中提供的WatchService和上一篇博文实现的Event Bus实现文件目录的监控的功能。在子目录下不断地创建、删除、修改文件,这些事件都将被收集并且提交给EventBus。原创 2023-07-09 18:30:38 · 13397 阅读 · 0 评论 -
并发编程 - Event Bus 设计模式
注册对象给Event Bus的时候需要指定接收消息时的回调方法,采用注解的方式进行Event回调/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/*** @author 小工匠/**原创 2023-07-09 13:46:16 · 13712 阅读 · 0 评论 -
并发编程 - 通过 Disruptor 来实现无锁无阻塞的并发编程
Disruptor是一种高性能的并发编程框架,它由LMAX Exchange公司开发,并于2011年开源。Disruptor旨在解决传统多线程编程中的性能瓶颈和并发问题,特别适用于需要高度并发处理的场景。Disruptor采用了一种称为"无锁编程"的机制,通过使用环形缓冲区(Ring Buffer)和事件驱动的方式实现高效的消息传递和处理。它的核心思想是将消息(事件)在生产者和消费者之间进行无锁的、高效的交换,以减少线程间的竞争和上下文切换。原创 2023-07-04 18:59:58 · 13686 阅读 · 0 评论 -
Java Review - Java进程内部的消息中间件_Event Bus设计模式
文章目录概述概述在工作中,我们都会使用到MQ 比如 Apache Kafka等,某subscriber在消息中间件上注册了某个topic(主题),当有消息发送到了该topic上之后,注册在该topic上的所有subscriber都将会收到消息 。消息中间件提供了系统之间的异步处理机制。 主业务完成后即可向用户返回成功的通知,然后提交各种消息至消息中间件,这样注册在消息中间件的其他系统就可以顺利地接收通知了,然后执行各自的业务逻辑。消息中间件主要用于解决进程之间消息异步处理的解决方案,这里,我们原创 2021-12-19 08:59:43 · 35220 阅读 · 3 评论 -
高并发编程-重排序
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。原创 2019-10-31 00:33:28 · 14300 阅读 · 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 · 14126 阅读 · 0 评论 -
高并发编程-重新认识Java内存模型(JMM)
文章目录从CPU到内存模型内存模型如何确保缓存一致性并发变成需要解决的问题 (原子性、可见性、有序性)内存模型需要解决的问题Java内存模型JMM的API实现原子性 synchronized可见性 volatile 、 synchronized 、 final有序性 synchronized 、volatile从CPU到内存模型高并发编程-通过volatile重新认识CPU缓存 和 Ja...原创 2019-10-30 16:32:38 · 14038 阅读 · 2 评论 -
高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)
文章目录概述例子概述这里我们逐步的揭开volatile的面纱我们知道,在多线程并发编程中synchronized和volatile都扮演着重要的角色。 volatile是轻量级的 synchronized,它在高并发中保证了共享变量的“可见性”。那什么是可见性呢?可见性 我们可以理解为:当一个线修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰的...原创 2019-10-29 15:26:51 · 14642 阅读 · 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 · 14381 阅读 · 0 评论 -
高并发编程-自定义简易的线程池(2),体会原理
文章目录概述示例概述高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来拒绝策略关闭线程池最小 最大 活动线程数…示例比较简单,直接上代码,见注释package com.artisan.test;import java.util.ArrayList;import java.util.Iterator;import ja...原创 2019-10-26 00:48:02 · 14119 阅读 · 0 评论 -
高并发编程-自定义简易的线程池(1),体会原理
文章目录概述概述我们工作中,并发编程必然离不开jdk提供的j.u.c中的线程池 ,假设让我们自己去设计一个线程池,该从哪几个方面来着手考虑呢?首先: 既然是线程池 , 那必然 有个初始化的线程数量 和 最大数量 ----> 两个属性 : init 和 max 其次:当线程池中的线程达到了 init 数量,但还没到max 数量的时候,将任务放入任务队列中,而不是直接开辟新的线程...原创 2019-10-19 00:14:20 · 14025 阅读 · 0 评论 -
高并发编程-捕获线程运行时的异常 + 获取调用链
文章目录概述捕获线程运行时的异常使用场景UncaughtExceptionHandler 接口示例获取调用链概述捕获线程运行时的异常我们看下Thread的定义 实现了Runnable接口重写了run方法根据方法签名可知,run方法是不能向上层抛出异常的,如果线程内部产生异常, 不catch的情况下,上层调用代码如何知道呢?使用场景为啥需要这样做呢?一个线程抛出异常之后,...原创 2019-10-18 16:47:18 · 14359 阅读 · 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 · 16135 阅读 · 0 评论 -
高并发编程-自定义带有超时功能的锁
文章目录概述步骤自定义超时异常处理类ILock接口实现类测试存在的问题修复存在的问题超时功能测试超时功能概述我们知道synchronized的机制有一个很重要的特点是:使用synchronized, 当一个线程获取了锁,其他线程只能一直等待,等待这个获取锁的线程释放锁,如果这个线程执行时间很长,其他线程就需要一直等待 。 除非获取锁的线程执行完了该代码块,释放锁或者线程执行发生异常,JVM...原创 2019-10-13 23:07:43 · 14266 阅读 · 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 · 13962 阅读 · 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 · 16977 阅读 · 0 评论 -
并发编程-26 高并发处理手段之服务降级与服务熔断 + 数据库切库分库分表
文章目录服务降级与服务熔断概述服务降级举例服务熔断 VS 服务降级服务降级要考虑的问题Hystrix数据库切库分库分表高可用的一些手段服务降级与服务熔断概述服务熔断: 一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,熔断也可以称为过载保护服务降级: 当服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此缓解服务器...原创 2019-03-10 20:28:20 · 15784 阅读 · 0 评论 -
并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
文章目录概述消息队列消息队列特性为什么需要消息队列消息队列的好处消息队列举例应用拆分应用拆分的原则应用拆分的思考应用拆分常用的组件DubboSpring Cloud应用限流限流算法 -- 计数器法 ,简单但是有临界问题限流算法 -- 滑动窗口 (Rolling Window),划分多个时间窗口解决临界问题限流算法 -- 漏桶(Leaky Bucket)限流算法 -- 令牌桶(Token Bucke...原创 2019-03-10 00:32:46 · 16344 阅读 · 4 评论 -
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
文章目录概述扩容思路垂直扩展(纵向扩展)水平扩展(横向扩展)缓存思路缓存特征缓存命中率影响因素缓存分类和应用场景Guava CacheMemcacheRedis概述这里只是讲通用的思路,而不会涉及具体的代码,实际高并发的场景需要根据实际情况来决定方案。扩容思路举个例子: 一共有60块砖, 1个工人。每次只能搬运10块。每次搬运耗时10分钟,这样的话,1个工人搬运完60块砖,就需要1个小...原创 2019-03-06 00:47:09 · 15952 阅读 · 0 评论