冷风扇666
稳扎稳打 脚踏实地
展开
-
优雅管理多线程异步任务 - 永动异步任务
在现代应用程序中,经常需要处理长时间运行的异步任务,如消息推送、定时任务等。本文将介绍一种基于线程池的多线程异步任务管理方案,并详细讨论任务的优雅关闭。在实际项目中,存在一些永动异步任务,需要一种灵活的管理方式。任务的优雅关闭也是一个关键需求,以确保在关闭应用程序时,所有任务都能完成当前处理的数据。通过合理的线程池管理和任务设计,我们成功实现了对多线程异步任务的优雅管理和关闭。观察了每个任务的循环执行过程,以及在关闭指令下任务是如何完成当前处理的数据后才关闭的。任务的关闭通过设置标志位来通知任务停止。原创 2024-02-01 02:00:00 · 701 阅读 · 4 评论 -
多线程 - JUC 中的 Exchange 交换器以及代码案例
【JUC 中的 Exchange 交换器以及代码案例】原创 2023-02-22 09:11:50 · 162 阅读 · 0 评论 -
多线程 - CyclicBarrier
CyclicBarrier是Java中的一个同步工具类,它允许一组线程在某个点上互相等待,直到所有线程都到达该点,然后再继续执行。它的工作方式类似于CountDownLatch,但它可以重复使用。具体来说,当CyclicBarrier被创建时,需要指定一个参与同步的线程数量以及一个当所有线程都到达该点时要执行的任务。在执行过程中,每个线程在到达该点时会调用await()方法来等待其他线程的到达。当所有线程都到达时,CyclicBarrier会自动解除等待状态,并执行指定的任务。原创 2023-05-13 03:15:00 · 589 阅读 · 3 评论 -
深入理解高并发编程 - 线程与线程池概念、线程的三种实现方式
在计算机科学中,线程(Thread)是进程的最小执行单位。一个进程可以包含多个线程,这些线程共享同一进程的资源,包括内存空间、文件描述符和其他系统资源。线程在操作系统中被调度执行,使得多个线程可以并发执行,从而实现程序的并发性。每个线程都有自己的执行路径,可以独立执行任务。一个进程的所有线程共享相同的代码段和数据段,这使得线程之间的通信和数据共享更加容易。由于线程之间切换的开销比进程之间切换的开销要小得多,因此在需要同时执行多个任务的情况下,使用多线程比多进程更加高效。原创 2023-08-07 01:00:00 · 222 阅读 · 1 评论 -
多线程 - CAS、ABA
CAS”通常是指“Compare and Swap”(比较并交换),它是一种用于实现并发算法的原子操作。它允许线程在修改共享变量之前比较该变量的值,并在值匹配时将其替换为新值。这种机制可用于实现非阻塞算法和无锁数据结构。原创 2023-05-15 05:30:00 · 275 阅读 · 8 评论 -
多线程 - 阻塞队列
阻塞队列是一种特殊的队列,它支持在队列为空时等待从队列中获取元素的操作,或在队列已满时等待插入元素的操作。当队列为空时,从队列中获取元素的操作会被阻塞,直到队列中有可用元素;当队列已满时,插入元素的操作会被阻塞,直到队列中有空闲空间。Java 提供了一些内置的阻塞队列,比如 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue 等。其中,ArrayBlockingQueue 是一种基于数组实现的阻塞队列,原创 2023-05-18 06:15:00 · 377 阅读 · 1 评论 -
多线程 - java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock
【java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock】原创 2023-02-22 10:32:32 · 1938 阅读 · 1 评论 -
多线程 - voliate
此外,volatile关键字还可以保证变量的有序性。在Java中,编译器、CPU以及操作系统等都可能对指令进行重排,以优化程序性能。在多线程环境下,这种重排可能会导致程序出现错误。volatile关键字可以禁止编译器和CPU对指令进行重排,从而保证了程序的有序性。在Java中,多个线程之间共享变量的值可能存在缓存不一致的问题,例如一个线程修改了变量的值,但是其他线程并不能立即看到这个修改。volatile关键字可以保证这个变量的值对于所有线程都是可见的,即任何一个线程对变量的修改都会立即被其他线程看到。原创 2023-05-09 08:00:00 · 202 阅读 · 10 评论 -
多线程 - LockSupport
在 Java 多线程中,LockSupport 类提供了一种比较底层的线程同步方式,可以用来实现线程的阻塞和唤醒。与 synchronized 关键字或 Lock 接口等高层同步机制相比,LockSupport 更为灵活,可以用来实现更加复杂的同步需求。需要注意的是,调用 unpark(Thread thread) 方法时,如果线程尚未阻塞,则下一次 park() 方法调用时会立即返回。因此,为了确保线程能够被正确唤醒,应该在 park() 方法之前调用 unpark(Thread thread) 方法。原创 2023-05-11 08:30:00 · 141 阅读 · 2 评论 -
多线程 - 原子类
在Java Util Concurrent(JUC)库中,原子类是一组线程安全的、基于CAS(Compare and Swap)算法实现的类,它们可以保证多线程环境下对一个共享变量的操作不会出现竞态条件(race condition)。Java中的原子类提供了一种非常高效的方式来进行同步和并发编程。使用这些原子类,可以避免使用synchronized关键字等传统的同步方式,从而提高应用程序的并发性能,并且保证数据的一致性。原创 2023-05-16 05:30:00 · 403 阅读 · 5 评论 -
深入理解高并发编程 - 深度解析Thread 类的源码
Thread 类是 Java 标准库中用于创建和管理线程的核心类之一。它提供了一系列方法和功能,用于创建、启动、管理和控制线程的行为。通过继承 Thread 类并重写 run 方法,可以创建一个新的线程。调用 start 方法来启动线程,启动后会执行 run 方法中的代码。Thread 类定义了多个枚举类型 State,表示线程可能的不同状态,如 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 和 TERMINATED。原创 2023-08-23 22:19:34 · 1188 阅读 · 87 评论 -
深入理解高并发编程 - 深度解析ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor 并实现了 ScheduledExecutorService 接口,这使得它可以同时充当线程池和定时任务调度器。原创 2023-08-19 20:53:22 · 470 阅读 · 19 评论 -
深入理解高并发编程 - 深度解析线程池中重要的顶层接口和抽象类
AbstractExecutorService 是一个抽象类,实现了 ExecutorService 接口的部分方法,为自定义线程池提供了一些通用的实现。它充当了一个骨架(框架)类,开发者可以继承这个抽象类并重写其中的方法来创建自己的线程池实现。// 实现了 ExecutorService 接口的 shutdown 方法// 实现了 ExecutorService 接口的 isShutdown 方法shutdown();原创 2023-08-12 01:00:00 · 286 阅读 · 6 评论 -
深入理解高并发编程 - 线程的执行顺序
在Java中,线程的执行顺序是由操作系统的调度机制决定的,具体顺序是不确定的,取决于多个因素,如操作系统的调度策略、线程的优先级、线程的状态转换等。因此,不能对线程的执行顺序做出可靠的假设。以下是一个简单的Java代码示例,演示了多个线程的执行顺序是不确定的,取决于操作系统的调度机制。在这个示例中,创建了三个线程thread1、thread2和thread3,它们都执行相同的任务,即输出当前线程的名称。由于操作系统的调度机制是不确定的,线程的执行顺序可能会不同,每次运行结果可能会有所不同。原创 2023-08-08 03:00:00 · 482 阅读 · 6 评论 -
深入理解高并发编程 - SimpleDateFormat 类的线程安全问题
在这个示例中,创建了两个线程,它们共享同一个 SimpleDateFormat 实例来格式化当前日期和时间。这个示例中,每个线程都会尝试格式化当前日期和时间,并在输出时稍微延迟一段时间。由于没有对 SimpleDateFormat 进行线程保护,两个线程可能会相互干扰,导致输出的格式化结果不符合预期,甚至引发异常。原创 2023-08-10 00:45:00 · 271 阅读 · 4 评论 -
深入理解高并发编程 - Callable 和 Future
V get() throws InterruptedException, ExecutionException 方法用于获取任务的结果。如果任务已经完成,它会立即返回结果;如果任务尚未完成,它会阻塞当前线程直到任务完成。如果任务抛出异常,调用 get() 方法会抛出 ExecutionException,其中的 getCause() 方法可以获取实际的异常。// 创建线程池 ExecutorService executor = Executors . newSingleThreadExecutor();原创 2023-08-09 01:45:00 · 307 阅读 · 4 评论 -
多线程 - 为什么要用读写锁?它有什么优点?以及使用案例
【为什么要用读写锁?它有什么优点?以及使用案例】原创 2023-02-22 10:18:17 · 688 阅读 · 0 评论 -
多线程 - synchronized修饰实例方法、修饰静态方法、修饰代码块
static synchronized 和 synchronized 修饰普通方法的区别在于:static synchronized 是在类级别上获取锁,而 synchronized 是在对象级别上获取锁。在 static synchronized 方法中,获取的是类级别的锁,不同的对象共享该锁,只有当一个线程持有该类的锁时,才能够调用该类的其他 static synchronized 方法。原创 2023-05-04 22:08:07 · 350 阅读 · 1 评论 -
深入理解高并发编程 - 通过 ThreadPoolExecutor 类深度解析线程池执行任务
execute(Runnable command): 该方法用于将任务提交给线程池执行。它会根据线程池状态、工作线程数量和工作队列状态来决定任务的执行方式,可以创建新的工作线程执行任务,将任务放入工作队列,或者根据拒绝策略来处理无法执行的任务。addWorker(Runnable firstTask, boolean core): 这个方法在工作线程不足时尝试添加一个新的工作线程。它会考虑线程池状态、工作线程数量、核心线程数和最大线程数等因素,以决定是否创建新的工作线程来执行任务。原创 2023-08-16 02:00:00 · 336 阅读 · 8 评论 -
深入理解高并发编程 - ScheduledThreadPoolExecutor 与 Timer
ScheduledThreadPoolExecutor 和 Timer 都用于执行定时任务,但在功能和用法上有一些区别。下面解释这些区别,并提供一些使用案例来说明它们的应用场景。原创 2023-08-18 21:59:53 · 338 阅读 · 4 评论 -
多线程 - 用户线程、守护线程
用户线程和守护线程的工作方式都是一样的,不同的是当程序中只剩下守护线程时,程序就会自动退出。原创 2023-05-08 07:45:00 · 164 阅读 · 4 评论 -
多线程 - CountDownLatch
CountDownLatch 的作用是在一个或多个线程等待其他线程完成执行某个操作后再继续执行。原创 2023-05-12 01:00:00 · 265 阅读 · 1 评论 -
多线程 - lock、tryLock、lockInterruptibly有什么区别?以及使用案例
【lock、tryLock、lockInterruptibly有什么区别?以及使用案例】原创 2023-02-22 10:28:36 · 1089 阅读 · 0 评论 -
深入理解高并发编程 - AQS 中的 ReentrantLock、ReentrantReadWriteLock、 StampedLock 与 Condition
ReentrantLock(可重入锁)是Java编程语言中的一种锁实现,它提供了一种基于显示锁(explicit lock)的机制,用于控制对共享资源的访问。与内置的synchronized关键字相比,ReentrantLock提供了更多的灵活性和功能,允许更细粒度的锁控制。总的来说,ReentrantLock是一种强大的锁机制,适用于需要更多灵活性和功能的并发场景。但在选择锁机制时,需要根据具体情况综合考虑性能、复杂性和可读性。原创 2023-08-25 20:56:32 · 132 阅读 · 0 评论 -
深入理解高并发编程 - 线程的生命周期
需要注意的是,线程的状态可以在不同的时间点之间切换,这取决于线程的执行和系统调度。管理线程的状态是编写多线程应用程序时需要特别关注的重要方面,以避免死锁、竞态条件等并发问题。原创 2023-08-08 00:45:00 · 162 阅读 · 0 评论 -
多线程 - Executor
【代码】多线程 - Executor。原创 2023-05-14 06:00:00 · 171 阅读 · 0 评论 -
深入理解高并发编程 - AQS 中的 CountDownLatch、Semaphore 与 CyclicBarrier
AQS(AbstractQueuedSynchronizer)是 Java 中用于实现同步器的一个抽象基类。它提供了构建各种同步工具的基础框架,如锁、信号量、倒计时器等。AQS 主要通过一个先进先出(FIFO)的等待队列来管理线程的竞争和等待状态。AQS 的核心思想是基于状态的控制和等待/通知机制。每个 AQS 子类都可以定义一个状态(state),并提供了一些基本方法来操作这个状态,例如获取锁、释放锁等。基于这些方法,AQS 能够实现线程的排他性访问以及线程之间的协调。原创 2023-08-24 21:01:57 · 321 阅读 · 4 评论 -
多线程 - 线程组
【代码】多线程 - 线程组。原创 2023-05-07 08:15:00 · 91 阅读 · 4 评论 -
深入理解高并发编程 - 分析创建线程池究竟有哪些方式
使用Executors工厂方法创建线程池是一种简单快捷的方式,适用于一些常见的线程池需求。原创 2023-08-14 20:49:40 · 350 阅读 · 3 评论 -
深入理解高并发编程 - Thread 类的 stop () 和 interrupt ()
stop() 方法被用于停止线程。然而,需要注意的是,stop() 方法已经被标记为已废弃(deprecated),并且不推荐使用。这是因为使用该方法可能导致不可预料的问题和数据不一致性,因此它被认为是不安全的。当调用 stop() 方法来终止一个线程时,它会立即停止线程的执行,无论线程是否在一个安全的状态下。这可能导致线程被终止时,它正在执行一些重要的操作,如写入文件、更新数据等,导致数据损坏或不一致。原创 2023-08-26 21:26:14 · 447 阅读 · 0 评论 -
深入理解高并发编程 - ThreadLocal
ThreadLocal 是 Java 中一个用于实现线程局部变量的工具类。线程局部变量是指每个线程都拥有自己独立的变量副本,不同线程之间的访问不会相互干扰。以下是关于 ThreadLocal 的总结:ThreadLocal 是 Java 中的一个工具类,用于实现线程局部变量的存储和访问机制。每个线程都可以拥有一个独立的 ThreadLocal 变量副本,不同线程之间互不干扰。主要用于解决多线程环境下的数据共享问题,每个线程都拥有自己的数据副本,避免了竞态条件。原创 2023-08-26 02:30:00 · 352 阅读 · 2 评论 -
多线程 - Semaphore
虽然 Semaphore 主要用于限制并发访问数,但是在实际应用中,Semaphore 还可以用于线程之间的协作,比如实现线程的顺序执行、线程间的消息传递等等。当一个线程需要访问共享资源时,它必须先获取一个许可证,如果没有许可证可用,线程就会被阻塞,直到有一个许可证可用。它通过维护一定数量的许可证来限制对共享资源的访问。当一个线程完成了对共享资源的访问后,它必须释放一个许可证,以便其他线程可以获取许可证继续访问共享资源。所以,Semaphore 并不仅仅是限制并发数,它还可以用于实现更多的线程协作场景。原创 2023-05-10 06:45:00 · 152 阅读 · 2 评论 -
多线程 - Unsafe
Java的sun.misc.Unsafe类提供了直接访问底层内存和执行不安全操作的功能。它是一个非常强大的工具,但使用它需要非常谨慎,因为它可以绕过Java的内存管理和访问控制机制。由于Unsafe类可以绕过Java的内存管理和访问控制机制,因此在使用时需要非常谨慎。如果使用不当,可能会导致内存泄漏、线程安全问题、JVM崩溃等问题。因此,通常情况下,应该尽量避免直接使用Unsafe类,而是使用更高级别的API来完成需要的操作。原创 2023-05-10 22:35:06 · 503 阅读 · 0 评论 -
深入理解高并发编程 - 分析线程池中 Worker 线程的执行流程
当有任务需要执行时,线程池会创建一个新的 "Worker" 对象,其中包含一个引用指向线程池本身,并将待执行的任务传递给 "Worker" 对象。"Worker" 对象中的 run() 方法被调用,作为线程的入口点。在 run() 方法中,会调用 runWorker(this) 方法开始执行任务。在 runWorker(Worker w) 方法中,首先获取当前线程的引用,并获取当前线程需要执行的任务。原创 2023-08-17 02:15:00 · 337 阅读 · 8 评论 -
深入理解高并发编程 - 解析线程池退出
线程池的退出是指在不再需要使用线程池时,正确地关闭和终止线程池中的线程,释放相关资源,以防止资源泄漏和不必要的开销。线程池的正确退出可以避免一些潜在的问题,如线程泄漏或应用程序无法正常终止等。原创 2023-08-18 02:15:00 · 403 阅读 · 6 评论 -
多线程 - 死锁案例以及排查工具有哪些?
【死锁案例以及排查工具有哪些?】原创 2023-02-22 09:21:07 · 224 阅读 · 0 评论 -
深入理解高并发编程 - 深度解析 ThreadPoolExecutor 类
ThreadPoolExecutor 是 Java 标准库中用于创建和管理线程池的核心类之一。它实现了 ExecutorService 接口,提供了丰富的线程池管理功能。下面将通过源码解析来深入了解 ThreadPoolExecutor 类的工作原理和各个重要部分。可以在 Java 源代码中找到 ThreadPoolExecutor 类的实现,位于 java.util.concurrent 包中。原创 2023-08-15 02:30:00 · 246 阅读 · 10 评论 -
多线程 - 常用多线程集合
CopyOnWriteArrayList 是 Java 中的一个并发集合,它是 ArrayList 的线程安全版本。和 ArrayList 不同的是,CopyOnWriteArrayList 采用了一种写时复制的策略,在写入操作时,它会先复制一个原有的数组,并进行修改操作,然后再将修改后的数组赋值给成员变量。原创 2023-05-19 07:00:00 · 366 阅读 · 1 评论 -
多线程 - 多线程是什么
【多线程是什么】原创 2023-02-22 09:06:23 · 262 阅读 · 0 评论 -
深入理解高并发编程 - 线程池与 初谈 ThreadPoolExecutor 类
AbstractExecutorService 是一个抽象类,实现了 ExecutorService 接口的部分方法,提供了一些默认的实现。它可以用作自定义线程池的基类。@Override@Override@Override@Override@Override@Override@Override可以根据需求自行在任务执行前、执行后、异常处理等地方插入代码,进行自定义的监控和日志记录。原创 2023-08-11 00:45:00 · 206 阅读 · 1 评论