第一眼看到AbstractQueuedSynchronizer,通常都会有这几个问题. AbstractQueuedSynchronizer为什么要搞这么一个类? 这个类是干什么的.有什么用? 这个类的实现原理是什么? 下面我边学边教,来解答这3个问题. 问题一:AbstractQueuedSynchronizer产生的背景 AbstractQueuedSynchronizer 我这里用简写AQS表示.如果开发者想自己定义一个同步器怎么写?Java程序员用C++写个同步器不现实,这时如果有一个用…
一.CountDownLatch 文档描述 A synchronization aid that allows one or more threads to wait until* a set of operations being performed in other threads completes. 是一个同步帮助工具,允许一个或多个线程等待一系列其他线程操作完后,再执行. count down 倒计时 latch 插锁 在Java中Latch结尾的也叫 闭锁 简单示例 public c…
参考文档 LinkedBlockingQueue和ArrayBlockingQueue的异同…
介绍 依赖关系 源码 构造方法 public ArrayBlockingQueue(int capacity) { this(capacity, false);//默认构造非公平的有界队列 } public ArrayBlockingQueue(int capacity,//指定队列大小 boolean fair,//指定是否使用公平锁 Collection<? extends E> c//指定初始化时加入集合 ) { this(capacity, fair); //初始化ReentrantL…
一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响应的速度 提高线程的可管理性 二.线程池的使用 public class ThreadPoolExecutorDemo { static class Worker implements Runnable{ @Override public void run() { try { Thread.slee…
1.      抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. (主题,当前目标,选择一部分进行,过程抽象,数据抽象) 2.      继承 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而…
一. 产生并发Bug的源头 可见性 缓存导致的可见性问题 原子性 线程切换带来的原子性问题 有序性 编译优化带来的有序性问题 上面讲到了 volatile 与可见性,本章再主要讲下原子性.有序性与Happens-Before规则. 二.线程切换带来的原子性问题 count += 1 这一句高级语言的语句,往往需要多条CPU执令.可以分为3步: 将count值加载到寄存器 在寄存器中对count进行+1操作 将count值写回内存 所以,我们需要在高级语言的层面上,确保一些操作是原子性操作. 三.…
一.概念 利用锁机制实现线程同步,synchronized关键字的底层交由了JVM通过C++来实现 Java中的锁有两大特性: 互斥性 同一时间,只允许一个线程持有某个对象锁. 可见性 锁释放前,线程对变量的修改,后面获得锁的线程可见. 二.用法 synchronized修饰位置与锁的关系: 同步方法 -- 对象锁,当前实例对象 静态同步方法 -- 类对象锁,当前对象的Class对象 同步方法块 -- 对象锁,synchonized括号里配置的对象 public class Synchroniz…
一.介绍 volatile保证共享变量的"可见性".可见性指的是当一个线程修改变量时,另一个线程能读到这个修改的值. 这里就要提出几个问题. 问题1:为什么一个线程修改时,另一个线程可能会"看不见"? 问题2:这种可见性是如何实现的? 二.问题1 变量为何"不可见" 回答:是由于缓存导致的可见性问题 2.1 为什么要引入缓存? 是为了解决性能问题.CPU的处理速度远远快于内存的读取速度(CPU与内存之间的瓶颈也叫"冯诺依曼瓶颈"…
介绍 JDK1.8引入CompletableFuture类. 使用方法 public class CompletableFutureTest { private static ExecutorService threadPool = new ThreadPoolExecutor(40, 100, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20)); public String B() { System.out.println(&qu…