摘要: 一、阻塞队列的由来 我们假设一种场景,生产者一直生产资源,消费者一直消费资源,资源存储在一个缓冲池中,生产者将生产的资源存进缓冲池中,消费者从缓冲池中拿到资源进行消费,这就是大名鼎鼎的生产者-消费者模式。 该模式能够简化开发过程,一方面消除了生产者类与消费者类之间的代码依赖性,另一方面将生产数据的过 阅读全文
posted @ 2020-11-03 20:05 jingdy 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 一、为什么要使用线程池 使用线程池主要有以下三个原因: 创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程。 控制并发的数量。并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因) 可以对线程做统一管理。 二、线程池的原理 Java中的线程池顶层接口是Executor接口,T 阅读全文
posted @ 2020-11-03 17:10 jingdy 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 一、AQS简介 AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器,从字面意思上理解: 抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现; 队列:使用先进先出(FIFO)队列存储数据; 同步:实现了同步的功能。 那AQS有什么用呢?AQS是一个用来构建锁和同步器 阅读全文
posted @ 2020-11-03 16:53 jingdy 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 一、乐观锁与悲观锁的概念 锁可以从不同的角度分类。其中,乐观锁和悲观锁是一种分类方式。 悲观锁:悲观锁就是我们常说的锁。对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 乐观锁:乐观锁又称为“无锁”,顾名思义,它是 阅读全文
posted @ 2020-11-03 16:17 jingdy 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。还有一点需要注意的是,我们常听到的类锁其实也是对象锁。Java类只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象),而Class对象也是特殊的Java对象。所以我们常说的类锁,其 阅读全文
posted @ 2020-11-03 14:49 jingdy 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 一、几个基本概念 在介绍volatile之前,我们先回顾及介绍几个基本的概念。 1.1、内存可见性 在Java内存模型那一章我们介绍了JMM有一个主内存,每个线程有自己私有的工作内存,工作内存中保存了一些变量在主内存的拷贝。内存可见性,指的是线程之间的可见性,当一个线程修改了共享变量时,另一个线程可 阅读全文
posted @ 2020-11-03 14:08 jingdy 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 一、什么是重排序? 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。 为什么指令重排序可以提高性能? 现在的CPU一般采用流水线来执行指令。简单地说,每一个指令都会包含多个步骤,每个步骤可能使用不同的硬件。因此,流水线技术产生了,流水线是并行的,多个指令可以同时处于同一个阶段, 阅读全文
posted @ 2020-11-03 11:27 jingdy 阅读(100) 评论(0) 推荐(0) 编辑