![](https://img-blog.csdnimg.cn/b531c45b825149da8d5f72e4cfdd977c.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 96
多核时代,并发问题要怎么解决呢
三省同学
牢骚太盛需自省,风物长宜放眼量。
展开
-
ThreadPoolExecutor详解
ThreadPoolExecutor详解Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类,主要由下列4个组 件构成。·corePool:核心线程池的大小。·maximumPool:最大线程池的大小。·BlockingQueue:用来暂时保存任务的工作队列。·RejectedExecutionHandler:当ThreadPoolExecutor已经关闭或ThreadPoolExecutor已经饱和时(达到了最大线程池大小且工作队列已满),execute()原创 2020-12-25 18:00:48 · 17538 阅读 · 0 评论 -
早安打工人-——Executor框架详解
前言在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们 为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时, 为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。 Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开 来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架的两级调度模型在HotSpot VM的线程模型中,原创 2020-12-25 10:45:58 · 6545 阅读 · 3 评论 -
听到线程池,你萌了吗
Java中的线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理原创 2020-12-24 11:26:07 · 6436 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore、Exchanger详解
CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作。 假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多 线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完 成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用 join()方法: public class JoinCountDownLatchTest { public static v原创 2020-12-07 15:54:34 · 5973 阅读 · 0 评论 -
SimpleDateFormat为什么是线程不安全
目录前言李四的秘密李四重启之问题分析李四终成之问题落幕前言SimpleDateFormat是 Java 提供的个格式化和解析日期的工具类,但是你是否在夜深人静的时候想过,自己通过SimpleDateFormat格式化日期的时候会不会出现线程安全方面的问题呢?李四就是这样,清晨,第二天顶着两个硕大的黑眼圈写起了bug,不不不,是写起来代码。正所谓怕什么来什么,尽管李四昨晚一夜的祈祷不要代码出现问题,但始终没能避免王二越来越近的步伐…李四的秘密王二对着李四说道:阿四啊,你最近干的不错,但是你有没原创 2020-09-03 19:10:22 · 7478 阅读 · 3 评论 -
Lock锁与Condition详解
目录引子重新认识Lock接口你了解Condition接口吗Condition接口与示例Condition如何实现引子三个线程分别打印A、B、C,要求按ABC的顺序循环打印10次。ReentrantLock和Conditon实现import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;pub原创 2020-09-02 13:36:21 · 6262 阅读 · 2 评论 -
线程的正确打开方式
前言Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的 其他语言具有明显的优势。线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 显著提升程序性能,在多核环境中表现得更加明显。但是,过多地创建线程和对线程的不当管 理也容易造成问题。本章将着重介绍Java并发编程的基础知识,从启动一个线程到线程间不同 的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍的 内容。什么是线程现代操作系统在运行一个程序时,会为其创建一个进程。例如,启原创 2020-08-27 19:08:23 · 4348 阅读 · 1 评论 -
Java内存模型-final
前言与前面介绍的锁和volatile相比,对final域的读和写更像是普通的变量访问。下面将介绍 final域的内存语义。final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用 变量,这两个操作之间不能重排序。2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能 重排序。下面通过一些示例性的代码来分别说明这两个规则。public class F原创 2020-06-08 21:06:08 · 4591 阅读 · 0 评论 -
Java内存模型之happens-before
前言happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。JMM的设计首先,让我们来看JMM的设计意图。从JMM设计者的角度,在设计JMM时,需要考虑两个 关键因素。·程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于 一个强内存模型来编写代码。·编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存原创 2020-06-08 21:05:34 · 4747 阅读 · 0 评论 -
Java内存模型之双重检查锁定与延迟初始化
前言在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双 重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的 错误根源,以及两种线程安全的延迟初始化方案。双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些 对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初 始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例 代码。public原创 2020-06-08 21:02:45 · 5090 阅读 · 0 评论 -
Java内存模型-锁(3)
前言众所周知,锁可以让临界区互斥执行。这里将介绍锁的另一个同样重要,但常常被忽视的功能:锁的内存语义。锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的 线程向获取同一个锁的线程发送消息。 下面是锁释放-获取的示例代码。class MonitorExample { int a = 0; public synchronized void writer() { // 1 a++; //原创 2020-05-28 20:55:13 · 4891 阅读 · 0 评论 -
Java内存模型之volatile(2)
前言本小节主要介绍3个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器中的实现;Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和顺序一致性内存模型的关系。volatile的内存语义当声明共享变量为volatile后,对这个变量的读/写将会很特别。为了揭开volatile的神秘面 纱,下面将介绍volatile的......原创 2020-05-28 20:54:55 · 10924 阅读 · 0 评论 -
Java内存模型(1)
前言本章大致分4部分:Java内存模型的基础,主要介绍内存模型相 关的基本概念;Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型;同步 原语,主要介绍3个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器 中的实现;Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型 和顺序一致性内存模型的关系。3.1......原创 2020-04-26 18:04:20 · 10965 阅读 · 0 评论 -
volatile和synchronized
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令。本章我们将深入底层一起探索下Java并发机制的底层实现原理。2.1 volatile的应用 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的 sy...原创 2020-01-17 12:27:10 · 13389 阅读 · 0 评论 -
并发编程问题
前言并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制 问题,本章会介绍几种并发编程的挑战以及解决方案。上下文切换CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但......原创 2020-01-15 21:16:24 · 11054 阅读 · 0 评论