多线程与并发
Java中的多线程和高并发编程
Forlogen
无论世事如何,你都要成为一个更优秀的人。
展开
-
线程安全的CopyOnWriteArrayList原理解析
文章目录1. 引入2. 源码剖析3. 总结1. 引入我们都知道java.util包下的ArrayList是线程不安全的,如果想要在多线程且存在竞争的场景下使用ArrayList,就需要通过一定的逻辑来保证线程安全。常用于解决ArrayList线程安全问题的方案有:Vector:类似于HashMap和Hashtable的关系,通过在可能发生线程安全问题的方法上直接使用synchronized关键字进行保证public synchronized E get(int index) { if (i原创 2020-10-06 09:55:01 · 446 阅读 · 0 评论 -
使用池化技术、令牌桶算法和漏桶算法实现限流的原理
文章目录1. 池化技术2. 令牌桶算法3. 漏桶算法4. 计数器算法1. 池化技术池化资源技术的限流其实就是通过计算器算法来控制全局的总并发数,例如常用的线程池中核心线程数和最大线程数的设置、数据库连接池中对于最大连接数的限制等等。就数据库连接池技术而言,为了避免并发场景下连接数超过数据库所能承载的最大上限,合理的运用连接池技术,可以有效的限制单个进程内能够申请到的最大连接数,确保在并发环境下连接数不会超过资源阈值。2. 令牌桶算法令牌桶算法主要用于限制流量的平均流入速率,并允许出现一定程度上的原创 2020-09-11 19:14:45 · 862 阅读 · 0 评论 -
你会使用Fork/Join框架更好的解决并发问题嘛?
文章目录1. 引入2. Fork/Join2.1 概念2.2 执行过程2.3 使用3. 源码分析4. 参考1. 引入假设,现在需要求解集合给定区间[start , end]内连续元素的和,你会怎么做呢?首先,一种最简单的方法就是在main方法中直接计算,或者新开一个线程来计算,如下所示:/** * @Author dyliang * @Date 2020/9/9 14:20 * @Version 1.0 */public class Demo { public static voi原创 2020-09-09 16:22:48 · 430 阅读 · 0 评论 -
深入浅出的理解HsahMap的实现原理及常见面试题
文章目录1. 引入2. Map接口3. 背景知识3.1 数据存储3.2 哈希算法3.3 哈希表4. HashMap实现原理4.1 JDK74.1.1 字段4.1.2 构造函数4.1.3 常用方法4.1.3.1 **put**4.1.3.2 get4.1.3.3 resize4.2 JDK84.2.1 字段4.2.2 构造函数4.2.3 常用方法4.2.3.1 put4.2.3.2 get4.2.3.3 resize5. 细节问题5.1 HashMap中存放自定义对象为什么要重写hashCode和equals原创 2020-07-10 16:38:54 · 481 阅读 · 0 评论 -
ReentrantWriteReadLock原理解读
文章目录@[toc]1. 引入2. ReentrantWriteReadLock2.1 概念2.2 核心2.3 图解流程2.4 锁降级3. 使用1. 引入前面所介绍的解决线程同步的方案中,不管是作为重量级锁的synchronized,或是优化后的synchronixed,以及同样支持可重入且可以更好的操作加锁和释放锁的ReentranLock,它们都属于排它锁。当多线程中的某一个线程竞争到了锁,那么不管其他线程执行的是读操作还是写操作,在没有获得锁的前提下都无法进行,这显然有些不太合理。按照常理来说,当原创 2020-09-06 18:38:46 · 565 阅读 · 0 评论 -
从源码实现理解ThreadLocal和InheritableThreadLocal
文章目录1. 简介2. 案例3. Thread类4. ThreadLocal类4.1 set()4.2 get()4.3 remove()4.4 不支持继承性5. InheritableThreadLocal类5.1 createMap()5.2 getMap()5.3 childvalue()6. ThreadLocalMap7. 参考1. 简介线程同步除了使用锁机制外,还可以使用ThreadLocal来避免线程不安全的出现。ThreadLocal提供线程本地变量,如果创建一个ThreadLoca原创 2020-06-22 08:42:15 · 255 阅读 · 0 评论 -
volatile关键字原理解读
文章目录1. 引入1.1 问题1.2 指令重排序1.3 读写屏障2. volatile2.1 概念2.2 底层实现3. 单例模式中的double-checking1. 引入1.1 问题共享变量在多线程操作场景下之所以会出现线程安全问题,主要原因就是每个线程对于变量的操作结果对其他线程是不可见。当一个线程已经修改了变量,而另一个线程使用的仍然是就的变量,那么就会出现线程安全问题。解决线程安全问题由两种思路:使用ThreadLocal队每个线程对象维护一个共享变量的副本多线程之间操作变量的结果彼此原创 2020-09-05 21:58:15 · 850 阅读 · 0 评论 -
深入体会优于synchronized的ReentrantLock的实现原理
文章目录1. Lock接口1.1 引入1.2 API2. 队列同步器2.1 概念2.2 目标2.3 设计思想3. 自定义同步器4. ReentrantLockd原理4.1 加锁原理4.2 释放锁原理4.3 可重入原理4.4 可打断原理4.5 公平锁原理1. Lock接口1.1 引入Lock接口是Jdk 5之后Java所提供的用于显式的获取和释放锁的接口,接口的定义如下:public interface Lock { void lock(); void lockInterruptib原创 2020-09-04 14:44:52 · 281 阅读 · 0 评论 -
浅析Java中的final关键字的使用和底层原理
final关键字和权限修饰符final:最终的,不可改变的。代码中final关键字同样表示最终的,不可改变的。常见的用法有四种:修饰一个类,格式:public final class 类名称{ ...}当前类不能有子类一个类如果被final修饰,那么其中的所有成员方法都无法进行覆盖重写修饰一个方法,当final关键字用来修饰一个方法的时候,这个方法就是最终方法,...原创 2020-04-21 12:26:40 · 1680 阅读 · 1 评论 -
synchronized实现原理和底层优化解读
文章目录1. 线程安全问题2. 概念2.1 基本语法2.2 锁对象3. Monitor3.1 对象内存布局3.2 对象头3.3 monitor4 重量级锁原理5. 偏向锁原理6. 轻量级锁原理7. 锁膨胀8. 自旋优化9. 锁粗化、锁消除1. 线程安全问题当多个线程对同一个共享变量执行操作时,就可能会出现线程安全问题。例如,下面的代码对共享变量count执行操作,其中线程t1执行自增,线程t2执行自减:/** * @Author dyliang * @Date 2020/8/18 23:03原创 2020-08-26 10:40:18 · 263 阅读 · 0 评论 -
通过线程八锁问题融会贯通synchronized关键字的使用
文章目录1. 一锁2. 二锁3. 三锁4. 四锁5. 五锁6. 六锁7. 七锁8. 八锁线程八锁凯有八门遁甲之术,你晓得线程八锁问题吗?赶紧来看一下吧~1. 一锁class Number{ public synchronized void a() { log.debug("1"); } public synchronized void b() { log.debug("2"); }}public static void m原创 2020-08-25 22:43:32 · 193 阅读 · 0 评论 -
线程安全的ConcurrentHashMap源码走读与分析
文章目录1. 引入2. ConcurrentHashMap in Jdk 1.72.1 底层结构2.2 类定义2.3 字段(属性)2.4 构造方法2.5 put2.6 get2.6 remove2.7 size2.8 rehash3. ConcurrentHashMap in Jdk 1.83.1 底层结构3.2 定义 + 字段3.2 构造方法3.3 get3.4 put3.5 size3.6 transfer4. 参考刚不动啦,后续再逐步细化理解吧,毕竟一次性理解所有的细节也不可能~1. 引入原创 2020-08-22 21:38:47 · 174 阅读 · 0 评论 -
Java线程池技术及Executor框架的原理和使用
文章目录1. 引入2. 使用2.1 创建线程池2.2 提交任务2.3 关闭线程1. 引入线程池指一个可容纳多个线程的容器,其中的线程可反复使用,节省了创建和销毁线程的开销。使用线程池的好处有:降低资源消耗:通过重复的利用已创建的线程可以降低线程创建和销毁造成的资源消耗提高响应速度:当任务达到时,任务无需自己创建线程就能立即执行提高线程的可管理性:使用线程池可以实现对于线程的统一分配、监控和调优线程池整个的执行逻辑如下:文字化表述为:线程池中刚开始没有线程,当一个任务提交给线程池后原创 2020-08-22 00:11:12 · 306 阅读 · 0 评论 -
Java原子操作类
文章目录1. 原子更新基本类型2. 原子更新数组3. 原子更新引用类型4. 原子更新字段类java.util.concurrent.atomic包提供了多类用法简单、性能高效、线程安全的原子操作类。主要包含以下四种类型:原子更新基本类型原子更新数组原子更新引用原子更新属性(字段)1. 原子更新基本类型其中原子更新基本类型主要是如下三个类:AtomicBoolean:原子更新布尔类型AtomicInteger:原子更新整型AtomicLong:原子更新长整型其中Atomi原创 2020-08-21 20:57:00 · 163 阅读 · 0 评论 -
Java线程内存模型
文章目录1. 硬件内存模型2. Java内存模型(Java Memory Model)3. 内存模型交互操作4. 三大特性4.1 原子性4.2 可见性4.3 有序性5. 参考这里熟悉Java内存模型的目的是为了后续对于多线程和并发问题的理解,以及相关源码的走读打下基础。1. 硬件内存模型操作系统和Spring Boot中的缓存及实现原理源码解读硬件层面的内存模型指的就是操作系统中的内存模型,在上面的文章中已经讲到了部分关于操作系统中CPU缓存层面的内容,下面只简要总结一下。多级内存模型或是原创 2020-08-19 21:15:00 · 180 阅读 · 0 评论 -
浅析Java中的多线程
在理解Java中多线程的相关内容前,我们需要对宏观层面上操作系统中和进程相关的内容做一些了解,在知道了操作系统是如何管理进程和线程后,才能更好的理解Java中有关多线程的创建、调度和同步控制等内容。1. 操作系统四大特性并发(concurrence)并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事...原创 2020-04-29 22:28:45 · 373 阅读 · 0 评论