深入浅出java多线程(十三):阻塞队列-编程思维

引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在多线程编程的世界里,生产者-消费者问题是一个经典且频繁出现的场景。设想这样一个情况:有一群持续不断地生产资源的线程(我们称之为“生产者”),以及另一群持续消耗这些资源的线程(称为“消费者”)。他们共享一个缓冲池,生产者将新生成的资源

多线程系列(二十一) -forkjoin使用详解-编程思维

一、摘要 从 JDK 1.7 开始,引入了一种新的 Fork/Join 线程池框架,它可以把一个大任务拆成多个小任务并行执行,最后汇总执行结果。 比如当前要计算一个数组的和,最简单的办法就是用一个循环在一个线程中完成,但是当数组特别大的时候,这种执行效率比较差,例如下面的示例代码。 long sum = 0; for (int i = 0; i < array.length; i++) {

多线程系列(十九) -future使用详解-编程思维

一、摘要 在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现Runnable接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务下载。 // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交任务 executor.submit(

多线程系列(十八) -aqs原理浅析-编程思维

一、摘要 在之前的文章中,我们介绍了 ReentrantLock、ReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor 等并发工具类的使用方式,它们在请求共享资源的时候,都能实现线程同步的效果。 在使用方式上稍有不同,有的是独占式,多个线程竞争时只有一个线程能执行方法,比如 ReentrantLock 等;

深入浅出java多线程(十一):aqs-编程思维

引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer)。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代多核CPU环境中,多线程编程已成为提升系统性能和并发处理能力的关键手段。然而,当多个线程共享同一资源或访问临界区时,如何有效地控制线程间的执行顺序以保证数据一致性及避免竞态条

多线程系列(十七) -线程组介绍-编程思维

一、简介 在之前的多线程系列文章中,我们陆陆续续的介绍了Thread线程类相关的知识和用法,其实在Thread类上还有一层ThreadGroup类,也就是线程组。 今天我们就一起来简单的聊聊线程组相关的知识和用法。 二、什么是线程组 线程组,简单来说就是多个线程的集合,它的出现主要是为了更方便的管理线程。 从结构角度看,线程组与线程之间其实是一个父子结构,一个线程组可以拥有几个线程,同时也可以拥

多线程系列(十五) -常用并发工具类详解-编程思维

一、摘要 在前几篇文章中,我们讲到了线程、线程池、BlockingQueue 等核心组件,其实 JDK 给开发者还提供了比synchronized更加高级的线程同步组件,比如 CountDownLatch、CyclicBarrier、Semaphore、Exchanger 等并发工具类。 下面我们一起来了解一下这些常用的并发工具类! 二、常用并发工具类 2.1、CountDownLatch Co

多线程系列(十一) -浅析并发读写锁stampedlock-编程思维

一、摘要 在上一篇文章中,我们讲到了使用ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。 如果继续深入的分析ReadWriteLock,从锁的角度分析,会发现它有一个潜在的问题:如果有线程正在读数据,写线程准备修改数据的时候,需要等待读线程释放锁后才能获取写锁,简单的说就是,读的过程中不允许写,这其实是一种悲观的读锁。 为了进一步的提升程序并发执行效率,Java 8 引

多线程系列(十三) -一文带你搞懂阻塞队列-编程思维

一、摘要 在之前的文章中,我们介绍了生产者和消费者模型的最基本实现思路,相信大家对它已经有一个初步的认识。 在 Java 的并发包里面还有一个非常重要的接口:BlockingQueue。 BlockingQueue是一个阻塞队列,更为准确的解释是:BlockingQueue是一个基于阻塞机制实现的线程安全的队列。通过它也可以实现生产者和消费者模型,并且效率更高、安全可靠,相比之前介绍的生产者和消

多线程系列(十二) -生产者和消费者模型-编程思维

一、简介 在 Java 多线程编程中,还有一个非常重要的设计模式,它就是:生产者和消费者模型。 这种模型可以充分发挥 cpu 的多线程特性,通过一些平衡手段能有效的提升系统整体处理数据的速度,减轻系统负载,提高程序的效率和稳定性,同时实现模块之间的解耦。 那什么是生产者和消费者模型呢? 简单的说,生产者和消费者之间不直接进行交互,而是通过一个缓冲区来进行交互,生产者负责生成数据,然后存入缓冲区;

多线程系列(十) -readwritelock用法详解-编程思维

一、摘要 在上篇文章中,我们讲到ReentrantLock可以保证了只有一个线程能执行加锁的代码。 但是有些时候,这种保护显的有点过头,比如下面这个方法,它仅仅就是只读取数据,不修改数据,它实际上允许多个线程同时调用的。 public class Counter { private final Lock lock = new ReentrantLock(); private

多线程系列(九) -reentrantlock常用方法详解-编程思维

一、简介 在上一篇文章中,我们介绍了ReentrantLock类的一些基本用法,今天我们重点来介绍一下ReentrantLock其它的常用方法,以便对ReentrantLock类的使用有更深入的理解。 二、常用方法介绍 2.1、构造方法 ReentrantLock类有两个构造方法,核心源码内容如下: /** * 默认创建非公平锁 */ public ReentrantLock() {

多线程系列(六) -等待和通知模型详解-编程思维

一、简介 在之前的线程系列文章中,我们介绍了synchronized和volatile关键字,使用它能解决线程同步的问题,但是它们无法解决线程之间协调和通信的问题。 举个简单的例子,比如线程 A 负责将 int 型变量 i 值累加操作到 10000,然后通知线程 B 负责把结果打印出来。 这个怎么实现呢?其中一个最简单的办法就是,线程 B 不断的通过轮询方式while(i == 10000)检查

多线程系列(七) -threadlocal 用法及内存泄露分析-编程思维

一、简介 在 Java web 项目中,想必很多的同学对ThreadLocal这个类并不陌生,它最常用的应用场景就是用来做对象的跨层传递,避免多次传递,打破层次之间的约束。 比如下面这个HttpServletRequest参数传递的简单例子! public class RequestLocal { /** * 线程本地变量 */ private static

多线程系列(八) -reentrantlock基本用法介绍-编程思维

一、简介 在之前的线程系列文章中,我们介绍到了使用synchronized关键字可以实现线程同步安全的效果,以及采用wait()、notify()和notifyAll()方法,可以实现多个线程之间的通信协调,基本可以满足并发编程的需求。 但是采用synchronized进行加锁,这种锁一般都比较重,里面的实现机制也非常复杂,同时获取锁时必须一直等待,没有额外的尝试机制,如果编程不当,可能就容易发

java并发编程实例--1.创建和运行一个线程-编程思维

从这一篇开始写Java并发编程实例,内容都翻译整理自书籍:《Java 7 Concurrency Cookbook》 谈到线程,无法逃避的一个问题就是: 并发(concurrency)和并行(parallellism)区别: 解释一:并发是指两个或多个事件在同一时间间隔发生;并行是指两个或者多个事件在同一时刻发生; 解释二:并发是多个任务在一

java并发编程实例--3.打断一个线程-编程思维

一般来讲一个java程序如果运行着多个线程,那么只有在这些线程都运行完毕后才会终止。 但有时候,我们需要去结束某个线程或者取消某个任务。此时就用到了Java线程的打断机制,即interruption。 本例中,我们将开发一个程序创建线程,5秒后将强制打断它。 PrimeGenerator.java package com.dy