Java并发编程
Java并发编程
码渔
学如逆水行舟,不进则退。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java并发编程 - 综合练习
一、烧水泡茶(统筹问题)统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。现用两个线程(两个人协作)模拟烧水泡茶过程:水壶不洗,不能烧开水,因而洗水壶是烧开水的前提。没开水、没茶叶、不洗茶壶茶杯,就不能泡茶,因而这些又是泡茶的前提。它们的相互关系,可以用下边的箭头图来表示:洗茶壶,洗茶杯,拿茶叶,或先或后,关系不大,而且同是一个人的活儿,因而可以合并成为:解法一:joinThread t1 = new Thr原创 2020-10-01 09:32:09 · 1327 阅读 · 0 评论 -
Java并发编程 - 第十一章 Java并发编程实践
前言:当你在进行并发编程时,看着程序的执行速度在自己的优化下运行得越来越快,你会觉得越来越有成就感,这就是并发编程的魅力。但与此同时,并发编程产生的问题和风险可能也会随之而来。本章先介绍几个并发编程的实战案例,然后再介绍如何排查并发编程造成的问题。一、生产者和消费者模式在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度。在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很原创 2020-10-01 20:10:13 · 563 阅读 · 0 评论 -
Java并发编程 - 第十章 Executor框架
前言:在 Java 中,使用线程来异步执行任务。Java 线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Java 的线程既是工作单元,也是执行机制。从 JDK 5 开始,把工作单元与执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。一、Executor 框架简介1.1 Executo原创 2020-10-01 13:39:55 · 654 阅读 · 0 评论 -
Java并发编程 - 第九章 Java 中的线程池
前言:Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来 3 个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。原创 2020-09-10 10:10:38 · 11310 阅读 · 0 评论 -
Java并发编程 - 第八章 Java中的并发工具类
前言:在 JDK 的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier 和 Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线程间交换数据的一种手段。本章会配合一些应用场景来介绍如何使用这些工具类。一、等待多线程完成的 CountDownLatchCountDownLatch 允许一个或多个线程等待其他线程完成操作。假如有这样一个需求:我们需要解析一个 Excel 里多个 sheet 的数据,此时可以考虑使用多原创 2020-09-04 11:58:40 · 13417 阅读 · 0 评论 -
Java并发编程 - 第七章 Java中的13个原子操作类
前言:当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量 i = 1,A 线程更新 i + 1,B 线程也更新 i + 1,经过两个线程操作之后可能 i 不等于 3,而是等于 2。因为 A 和 B 线程在更新变量i的时候拿到的 i 都是 1,这就是线程不安全的更新操作,通常我们会使用 synchronized 来解决这个问题,synchronized 会保证多线程不会同时更新变量 i。而 Java 从 JDK 1.5 开始提供了 java.util.concurrent.原创 2020-09-03 11:07:49 · 13465 阅读 · 0 评论 -
Java并发编程 - 第六章 Java并发容器和框架
前言:Java程序员进行并发编程时,相比于其他语言的程序员而言要倍感幸福,因为并发编程大师 Doug Lea 不遗余力地为 Java 开发者提供了非常多的并发容器和框架。本章让我们一起来见识一下大师操刀编写的并发容器和框架,并通过每节的原理分析一起来学习如何设计出精妙的并发程序。一、ConcurrentHashMap 的实现原理与使用1.1 为什么要使用 ConcurrentHashMap在并发编程中使用 HashMap 可能导致程序死循环。而使用线程安全的 HashTable 效率又非常低下,基于原创 2020-09-02 18:16:34 · 13383 阅读 · 0 评论 -
Java并发编程 - 第五章 Java中的锁
前言:本章将介绍 Java 并发包中与锁相关的 API 和组件,以及这些 API 和组件的使用方式和实现细节。内容主要围绕两个方面:使用,通过示例演示这些组件的使用方法以及详细介绍与锁相关的 API;实现,通过分析源码来剖析实现细节,因为理解实现的细节方能更加得心应手且正确地使用这些组件。希望通过以上两个方面的讲解使开发者对锁的使用和实现两个层面有一定的了解。一、Lock 接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问原创 2020-09-01 16:42:52 · 13561 阅读 · 0 评论 -
Java并发编程 - 第四章 Java并发编程基础
前言:Java 从诞生开始就明智地选择了内置对多线程的支持,这使得 Java 语言相比同一时期的其他语言具有明显的优势。线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序性能,在多核环境中表现得更加明显。但是,过多地创建线程和对线程的不当管理也容易造成问题。本章将着重介绍Java并发编程的基础知识,从启动一个线程到线程间不同的通信方式,最后通过简单的线程池示例以及应用(简单的 Web 服务器)来串联本章所介绍的内容。一、线程简介1.1 什么是线程现代操作系统在运行一个程序时,会为原创 2020-08-25 15:15:39 · 13643 阅读 · 0 评论 -
Java并发编程 - 第三章 Java内存模型
前言:Java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 Java 程序员,本章将揭开 Java 内存模型神秘的面纱。一、Java 内存模型的基础1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息原创 2020-08-24 18:16:41 · 13597 阅读 · 0 评论 -
Java并发编程 - 第二章 Java并发机制的底层实现原理
前言:Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编指令在 CPU 上执行,Java 中所使用的并发机制依赖于 JVM 的实现和 CPU 的指令。本章我们将深入底层一起探索下 Java 并发机制的底层实现原理。一、volatile 的应用在多线程并发编程中synchronized和volatile都扮演着重要的角色volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当原创 2020-08-21 09:15:22 · 13669 阅读 · 0 评论 -
Java并发编程 - 第一章 并发编程面临的挑战
前言:并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本章会介绍几种并发编程的挑战以及解决方案。一、上下文切换即使是单核处理器也支持多线程执行代码,CPU 通过给每个线程分配 CPU 时间片来实现这个机制。时间片是 CPU 分配给各个线程的时间,因为时间片非常短,所以 CPU 通过不停地切 换线程执行,让我原创 2020-08-19 10:17:02 · 13492 阅读 · 0 评论 -
Java并发编程 - 基础概念
一、进程进程,是指计算机中已运行的程序。进程曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间原创 2020-08-16 17:47:12 · 13429 阅读 · 0 评论
分享