Java并发之ThreadPoolExecutor源码解析(二)-编程思维

ThreadPoolExecutor ThreadPoolExecutor是ExecutorService的一种实现,可以用若干已经池化的线程执行被提交的任务。使用线程池可以帮助我们限定和整合程序资源,尽可能避免创建新的线程来执行任务从而降低任务调用的开销,在执行大量异步任务的时候反而能获得更好的性能。此外,ThreadPoolExecutor还会维护一些统计信息,比如已完成的任务数量。 juc

Java并发之ThreadPoolExecutor源码解析(三)-编程思维

Worker 先前,笔者讲解到ThreadPoolExecutor.addWorker(Runnable firstTask, boolean core),在这个方法中工作线程可能创建成功,也可能创建失败,具体视线程池的边界条件,以及当前内存情况而定。 那么,如果线程池当前的状态,是允许创建Worker对象的,那么创建Worker的内部流程又是怎样呢?线程池为何要使用Worker包装Thread

Java并发之ReentrantLock源码解析(一)-编程思维

ReentrantLock ReentrantLock是一种可重入的互斥锁,它的行为和作用与关键字synchronized有些类似,在并发场景下可以让多个线程按照一定的顺序访问同一资源。相比synchronized,ReentrantLock多了可扩展的能力,比如我们可以创建一个名为MyReentrantLock的类继承ReentrantLock,并重写部分方法使其更加高效。 当一个线程调用Re

Java并发之ReentrantLock源码解析(二)-编程思维

在了解如何加锁时候,我们再来了解如何解锁。可重入互斥锁ReentrantLock的解锁方法unlock()并不区分是公平锁还是非公平锁,Sync类并没有实现release(int arg)方法,这里会实现调用其父类AbstractQueuedSynchronizer的release(int arg)方法。在release(int arg)方法中,会先调用其子类实现的tryRelease(int

Java并发之ReentrantLock源码解析(三)-编程思维

ReentrantLock和BlockingQueue 首先,看到这个标题,不要怀疑自己进错文章,也不要怀疑笔者写错,哈哈。本章笔者会从BlockingQueue(阻塞队列)的角度,看看juc包下的阻塞队列是如何使用ReentrantLock。这个章节笔者会介绍部分阻塞队列的源码,但不会着墨过多,我们的重点依旧在ReentrantLock上。 BlockingQueue(阻塞队列)是juc包下提

Java并发之ReentrantLock源码解析(四)-编程思维

Condition 在上一章中,我们大概了解了Condition的使用,下面我们来看看Condition再juc的实现。juc下Condition本质上是一个接口,它只定义了这个接口的使用方式,具体的实现其实是交由子类完成。 public interface Condition { void await() throws InterruptedException; void awaitUn

Java并发之Semaphore源码解析(一)-编程思维

Semaphore 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫。下面,我们进入本章正题Semaphore。 从概念上来讲,信号量(Semaphore)会维护一组许可证用于限制线程对资源的访问,当我们有一资源允许线程并发访问,但我们希望能限制访问量,就可以用信号量对访问线程进行限制。当线程要

Java并发之Semaphore源码解析(二)-编程思维

在上一章,我们学习了信号量(Semaphore)是如何请求许可证的,下面我们来看看要如何归还许可证。 可以看到当我们要归还许可证时,不论是调用release()或是release(int permits),都会调用AQS实现的releaseShared(int arg)方法。在releaseShared(int arg)方法中会先调用子类实现的tryReleaseShared(int arg)方

Java并发之ReentrantReadWriteLock源码解析(一)-编程思维

ReentrantReadWriteLock 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析和Semaphore源码解析,这两章介绍了很多方法都是本章的铺垫。下面,我们进入本章正题ReentrantReadWriteLock。 ReentrantReadWriteLock与ReentrantLock的使用方式有些相似,它提供了读锁(ReadLock)和写锁(

Java并发杂谈(一):volatile的底层原理,从字节码到CPU-编程思维

volatile的特性 volatile是Java中用于修饰变量的关键字,其主要是保证了该变量的可见性以及顺序性,但是没有保证原子性;其是Java中最为轻量级的同步关键字; 接下来我将会一步步来分析volatile关键字是如何在Java代码层面、字节码层面、JVM源码层次、汇编层面、操作系统层面、CPU层面来保证可见性和顺序性的; Java代码层面 当一个变量被定义为volatile之后,具备两

Java 异步 I/O-编程思维

Java 中的异步 I/O 简称 AIO, A 即 Asynchronous。AIO 在 JDK1.7 时引入,基于操作系统提供的异步 I/O 通信模型,封装了一些进行异步 I/O 操作的 API。 1. 异步 I/O 模型 学习 Java I/O 相关操作之前应该先了解其背后的 I/O 模型。Java 典型的基于流的文件操作和网络通信都是基于同步阻塞 I/O 模型,JDK1.4 引入的 NIO

浅谈 Java 多线程(一) --- JMM-编程思维

为什么使用多线程 更多的处理器核心数(硬件的发展使 CPU 趋向于更多的核心数,如果不能充分利用,就无法显著提升程序的效率) 更快的响应时间(复杂的业务场景下,会存在许多数据一致性不强的操作,如果将这些操作并行执行,则响应时间会大大缩短) 更好的编程模型(Java 为多线程编程提供了良好的编程模型及众多工具,使用起来非常方便) 并发编程的挑战 线程的创建和销毁需要开销(可以通过线程池解决) 更多

线程池底层原理-编程思维

线程池底层原理 ThreadPoolExecutor 参数 corePoolSize(必填) : 核心线程数 maximumPoolSize(必填):最大线程数 keepAliveTime(必填):线程空闲时长。如果超过该时长,非核心线程就会被回收。 unit(必填):指定keepAliveTime的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeU

java并发工具类-编程思维

一、CountDownLatch 字面意思:倒计时锁闩,该类可以实现一个线程在等其他多个线程执行完之后,继续执行。 入参是一个计数器的值,当一个线程执行完毕时调用countDown()方法,计数器值会减1,当计数器值为0时,被await()阻塞的线程将被唤醒。 CountDownLatch latch = new CountDownLatch(10); 大家都玩过王者荣耀的5V5排位吧,当己方

java死锁-编程思维

一、死锁产生的四个必要条件 1.1、互斥 即当资源被一个线程使用(占有)时,别的线程不能使用 1.2、不可剥夺 资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 1.3、请求和保持 即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 1.4、循环等待 即存在一个等待闭环链路:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。 二、模拟死锁产生 假如有这

java并发锁-编程思维

序号 锁名称 应用 1 乐观锁 CAS 2 悲观锁 synchronized、vector、hashtable 3 自旋锁 CAS 4 可重入锁 synchronized、Reentrantlock、Lock 5 读写锁 ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet 6 公平锁 R

volatile底层实现原理-编程思维

内存屏障 原文地址 作者:Martin Thompson 译者:一粟 校对:无叶,方腾飞 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术。 CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度。在上一篇文章 “[Write Combing](http://ifeve.com/memo

ThreadLocal原理-编程思维

一、Thread public class Thread(){ //省略部分 //属于这个线程的ThreadLocals,这个map由ThreadLocal类维护 ThreadLocal.ThreadLocalMap threadLocals = null; //省略部分 } 二、ThreadLocal public class Thre