
并发编程
菜鸟技术栈
这个作者很懒,什么都没留下…
展开
-
JAVA并发编程:线程池ThreadPoolExecutor源码分析
前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程。在看源码的时候,首先带着以下两个问题去仔细阅读。一是线程池如何保证核心线程数不会被销毁,空闲线程数会被销毁的呢?二是核心线程和空闲线程的区别到底是什么? 首先,我们先来看一下以下两个示例,从代码示例走入底层源码,真正做到了如指掌。1、示例分析package cn.lspj.threadpool;import java.text.SimpleDateFormat;import java.ut原创 2020-11-09 23:55:47 · 341 阅读 · 0 评论 -
JAVA并发编程:详解Executors工厂创建线程池的5种方法
上一篇我们详细讲解了线程池的工作原理及其基本的应用,本文主要讲解一下使用Executors工厂创建线程池的5中方法,在JDK1.7中只提供了4中方法(前面4种),而在JDK1.8中新增了一种方法,详细请见下文第五种方式。1、创建固定线程数线程池 创建固定线程数的线程池一共有两个方法,分别如下所示:public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nT原创 2020-11-04 00:03:39 · 487 阅读 · 0 评论 -
JAVA并发编程:详解线程池的工作原理及应用
1、为什么要使用线程池? Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来以下几个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成 的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立 即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会 消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和 监控。2、线程池核心类的类关系 Exec原创 2020-10-30 00:02:59 · 279 阅读 · 0 评论 -
JAVA并发编程:读写锁ReentrantReadWriteLock的基本使用及JDK源码中金典案例分析
1、读写锁简介 之前提到锁(如 Mutex 和ReentrantLock)基本都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。   读写锁维护了一对锁,一个读锁和一个写锁,读写锁在 ReentrantLock 上进行了拓展,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。   除了保证写操作对读操作的可见性以及并发性原创 2020-09-22 11:20:06 · 266 阅读 · 0 评论 -
JAVA并发编程:深入解析死锁、如何使用JVM自带分析工具检测死锁
1、什么是死锁?死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。2、产生死锁的必要条件互斥条件:所谓互斥就是进程在某一时间内独占资源。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。原创 2020-09-15 20:47:55 · 390 阅读 · 0 评论 -
JAVA并发编程:深入解析JDK1.8中HashMap、并发容器ConcurrentHashMap原理及其源码分析
一、HashMap详解1、基本介绍1.1 概述原创 2020-08-12 16:26:41 · 1203 阅读 · 0 评论 -
JAVA并发编程:深入解析JDK1.7中HashMap、并发容器ConcurrentHashMap原理及其源码分析
1、HashMap1.1// 构造一个具有指定初始值容量和负载因子的空HashMappublic HashMap(int initialCapacity, float loadFactor) { // 判断传入的初始容量是否大于0,如果小于0,则抛出相应异常信息。 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " +原创 2020-07-09 18:40:44 · 361 阅读 · 0 评论 -
JAVA并发编程:详解AQS、显示锁Lock、ReentrantLock及源码分析
1、显示锁 有了 synchronized 为什么还要 Lock? Java 程序是靠 synchronized 关键字实现锁功能的,使用 synchronized 关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。显示锁的特性:尝试非阻塞地获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。能被中断地获取锁:与synchronized关键字不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。原创 2020-06-16 23:36:33 · 275 阅读 · 0 评论 -
JAVA并发编程:详解原子操作、如何使用CAS实现原子操作、JDK中相关原子操作类的基本使用
1、什么是原子操作? 假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。2、如何实现原子操作? 实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制,synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁。 这里会有些问题:首先,如果被阻塞的线程原创 2020-05-29 19:11:44 · 348 阅读 · 0 评论 -
JAVA并发编程:线程并发工具类Callable、Future 和FutureTask的使用
1、基本介绍 Runnable 是一个接口,在它里面只声明了一个 run()方法,由于 run()方法返回值为 void 类型,所以在执行完任务之后无法返回任何结果。 Callable 位于 java.util.concurrent 包下,它也是一个接口,在它里面也只声明 了一个方法,只不过这个方法叫做 call(),这是一个泛型接口,call()函数返回的类型就是传递进来的 V 类型。 Future 就是对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成原创 2020-05-21 11:38:22 · 443 阅读 · 0 评论 -
JAVA并发编程:线程并发工具类CountDownLatch与CyclicBarrier的作用、应用场景和实战
一、CountDownLatch1、基本概念及作用JDK解释:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 闭锁,CountDownLatch 这个类能够使一个线程等待一个或多个线程成各自的工作后再执行。 CountDownLatch 是通过一个计数器来实现的,计数器的初始值为原创 2020-05-19 18:39:19 · 433 阅读 · 0 评论 -
JAVA并发编程:线程并发工具类Fork-Join原理分析及实战
1、Fork-JoinJava下多线程的开发我们可以自己启用多线程、线程池,还可以使用ForkJoin。 ForkJoin 可以让我们不去了解诸如 Thread、Runnable 等相关的知识,只要遵循 ForkJoin 的开发模式,就可以写出很好的多线程并发程序。2、Fork-Join体现了分而治之什么是分而治之?一种设计思想、策略。十大计算机经典算法:快速排序、堆排序、归并排序、二分查找、线性查找、深度优先、广度优先、Dijktra、动态规划、朴素贝叶斯分类。其中有三个就属于分而治之的设计思想,分原创 2020-05-16 20:26:59 · 200 阅读 · 0 评论 -
并发编程:线程中Join方法的使用示例分析
Join方法的使用,简单来说就是把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行。 比如在线程 B 中调用了线程 A 的 Join()方法,直到线程 A 执行完毕后,才会继续执行线程 B。代码示例如下所示:package cn.lspj.ch1.base;public class UseJoin { static class A implements Ru...原创 2020-05-05 02:07:27 · 508 阅读 · 0 评论 -
并发编程:线程基础、JAVA新启线程的方式
一、简单描述什么是进程和线程1、进程:进程是程序运行资源分配的最小单位。2、线程:线程是CPU调度的最小单位,必须依赖于进程而存在。二、创建线程的几种方式在JDK的源码Thread类中明确表示,创建线程的方式一共有两种:一种是继承Thread类 另外一种是实现Runnable接口。如下图Thread类中的描述所示:具体示例请看如下代码:package cn....原创 2020-05-02 17:12:11 · 173 阅读 · 0 评论