57.CountdownLatch介绍

[TOC]一、概述CountDownLatch(倒计时锁) 能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。它相当于是一个计数器,这个计数器的初始值就是线程的数量,每当一个任务完成后,计数器的值就会减一,当计数器的值为 0 时,表示所有的线程都已经任务了,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。应用场景典型的应用场景就是当一个服务启动时,同...

Java 2022-12-01 PM 776次 0条

56.Semaphore介绍

[TOC]一、概述Semaphore是向外分发资源的许可证,可以允许一个或多个任务同时访问资源。Semaphore通过构造参数来指定许可证的数量;acquire方法阻塞式获取许可证;release方法释放许可证。可以将其比喻为地铁的安检,每当人流量高峰的时候,安检会先让几个人进去,然后拦住后面的人,待前面几人通过安检门后,会对后面的人用相同的方式放行。特点Semaphore(信号量)是一种计...

Java 2022-11-29 PM 1023次 0条

55.StampedLock介绍

[TOC]前言ReadWriteLock适用于读多写少的场景,允许多个线程同时读取共享变量。但在读多写少的场景中,还有更快的技术方案。在jdk8以后,java提供了一个性能更优越的读写锁并发类StampedLock,该类的设计初衷是作为一个内部工具类,用于辅助开发其它线程安全组件,用得好,该类可以提升系统性能,用不好,容易产生死锁和其它莫名其妙的问题。本文主要和大家一起学习下StampedL...

Java 2022-11-28 PM 775次 0条

54.ReentrantReadWriteLock实现原理详解

[TOC]一、ReentrantReadWriteLock简单流程1.1 独占获取锁简单流程独占获取锁流程独占锁获取(writeLock写锁),首先判断是否有线程获取了锁,是否有线程获取了锁的判断通过读写锁中通过32位int类型state可以获取,其中低16位表示读锁,高16表示写锁。有读锁:直接排队阻塞。有写锁:还需要判断写锁线程是否是自己,如果是自己就是锁重入了,如果不是自己说明已经有其...

Java 2022-11-28 PM 867次 0条

53.ReentrantReadWriteLock应用之缓存

[TOC]一、缓存更新策略更新时,是先清缓存还是先更新数据库先清缓存,再更新数据库结果:造成查询的值和数据库中的值不一致先更新数据库,再清除缓存结果:造成A线程首次查询和后续查询得到不一致的结果,首次查询得到 x=1,后续查询发现已经清空了缓存,需要去数据库中查得 x=2补充一种情况,假设查询线程 A 查询数据时恰好缓存数据由于时间到期失效,或是第一次查询这种情况的出现几率非常小,见 fac...

Java 2022-11-27 PM 821次 0条

52.ReentrantReadWriteLock介绍

[TOC]前言之前也整理过一篇关于读写锁的文章:《Java锁--读写锁简介》,现在又碰到这个话题,就在系统清晰的整理一遍,温故一下之前所学习的并发知识。一、概述ReentrantLock是独占锁,某一时刻只有一个线程可以获取该锁,而实际上会存在很多读多写少的场景,而读操作本身并不会存在数据竞争问题,如果使用独占锁,可能会导致其中一个读线程使其他的读线程陷入等待,降低性能。针对这种读多写少的场...

Java 2022-11-27 PM 978次 0条

51.ReentrantLock原理

[TOC]前言ReentrantLock关系类图:ReentrabtLock实现了LOCK接口,里面维护了一个sync同步器,Sync是一个抽象类,有两种实现FairSync和NonfairSync分别对应着公平锁和非公平锁两种实现。一、非公平锁实现原理1.1 示例代码示例import lombok.extern.slf4j.Slf4j; import java.util.concurren...

Java 2022-11-26 PM 782次 0条

50.AQS实现原理介绍

[TOC]前言Java.util.concurrent(J.U.C)大大提高了并发性能,AQS是JUC的核心,是阻塞式锁相关的同步器工具的框架,是一个主要用来构建锁和同步器的抽象类。一、AQS介绍AQS 全程为 AbstractQueuedSynchronizer,它提供了一个 FIFO 队列,可以看成是一个用来实现同步锁及其它涉及到同步功能的核心组件,常见的有,ReentrantLock、...

Java 2022-11-26 PM 973次 0条

49.Fork&Join框架介绍

[TOC]一、概述Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的CPU密集型运算。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解。Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完...

Java 2022-11-24 PM 1019次 0条

48.Tomcat线程池简单介绍

[TOC]前言tomcat的线程池扩展了jdk的executor,而且队列用的是自己的task queue,因此其策略与jdk的有所不同。本篇将讨论一下tomcat线程池和jdk线程池的不同之处,以及tomcat为什么要重写jdk线程池的方法。一、Tomcat的请求处理过程一个客户端请求到达Tomcat之后的处理流程如上图所示:当Tomcat启动后,Connector的接收器Acceptor...

Java 2022-11-23 PM 1294次 0条