自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 收藏
  • 关注

原创 Redis 复制详解

Redis 复制详解1. 复制配置1.1 建立复制1.2 断开复制1.3 安全性1.4 只读1.5 传输延迟2. 拓扑2.1 一主一从结构2.2 一主多从结构2.3 树状主从结构3. 复制原理3.1 复制过程3.2 数据同步3.3 全量复制3.4 部分复制  在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis 也是如此,它为我们提供了复制功能,实现了相同数据的多个 Redis 副本。  1. 复制配置1.1 建立复制  参与复制的 Re

2021-01-28 19:18:58 477

原创 Redis 持久化详解

Redis 持久化详解1. RDB1.1 触发机制1.2 流程说明1.3 RDB文件的处理1.4 RDB的优缺点2. AOF2.1 使用AOF2.2 执行流程2.2.1 命令写入2.2.2 文件同步2.2.3 重写机制2.2.4 重启加载2.2.5 文件校验3. 问题定位与优化3.1 fork操作3.2 子进程开销监控和优化3.3 AOF追加阻塞4. 多实例部署  Redis 支持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实

2021-01-28 14:12:51 381

原创 Redis 客户端

Redis 客户端1. 客户端管理1.1 客户端 API1.1.1 client list1.1.1.1 标识:id、addr、fd、name1.1.1.2 输入缓冲区:qbuf、qbuf-free1.1.1.3 输出缓冲区:obl、oll、omem1.1.1.4 客户端的存活状态1.1.1.5 客户端的限制 maxclients 和 timeout1.1.1.6 客户端类型1.1.2 client kill1.1.3 client pause1.1.4 monitor1.2 客户端相关配置1.3 客户端统

2021-01-27 20:01:55 374

原创 Redis 小功能大用处

Redis 小功能大用处1. 慢查询分析1.1 慢查询的两个配置参数1.2 慢查询命令1.2.1 获取慢查询日志1.2.2 获取慢查询日志列表当前的长度1.2.3 慢查询日志重置1.3 最佳实践2. Redis Shell2.1 redis-cli 详解2.2 redis-server 详解2.3 redis-benchmark 详解3. Pipeline3.1 Pipeline 概念3.2 性能测试3.3 原生批量命令与Pipeline对比3.4 最佳实践4. 事务与Lua4.1 事务4.2 Redis与

2021-01-27 15:21:17 147

原创 Redis 基本数据结构理解与使用

Redis 基本数据结构理解与使用1. 概览1.1 全局命令1.1.1 keys 查看所有键1.1.2 dbsize 键总数1.1.3 exists 检查键是否存在1.1.4 del 删除键1.1.5 expire 键过期1.1.6 type 键的数据结构类型1.1.7 object encoding 命令查询内部编码1.2 数据结构和内部编码1.3 单线程架构1.3.1 单线程模型1.3.2 为什么单线程还能这么快2. 字符串2.1 命令2.1.1 set 设置值2.1.2 get 获取值2.1.3 ms

2021-01-26 17:36:47 520

原创 Redis 之初识

Redis 之初识1. 盛赞 Redis2. Redis 特性3. Redis 使用场景3.1 Redis可以做什么3.2 Redis 不可以做什么4. 用好 Redis 的建议5. 正确安装并启动 Redis5.1 安装 Redis5.2 配置、启动、操作、关闭Redis5.2.1 启动 Redis5.2.2 Redis 命令行客户端5.2.3 停止 Redis 服务1. 盛赞 RedisRedis 是一种基于键值对(key-value)的NoSQL数据库,与很多键值对 数据库不同的是,Redis

2021-01-25 19:43:08 101

原创 Java 虚拟机详解

Java 虚拟机详解1. Java 虚拟机1.1 什么是虚拟机1.2 JVM 由哪些部分组成2. JVM 内存结构2.1 程序计数器(线程私有)2.2 虚拟机栈(线程私有)2.3 本地方法区(线程私有)2.4 堆(Heap - 线程共享)- 运行时数据区2.4.1 新生代2.4.1.1 Eden 区2.4.1.2 ServivorFrom2.4.1.3 ServivorTo2.4.2 老年代2.5 元数据(线程共享)2.5.1 静态常量池2.5.2 运行时常量池2.5.3 字符串常量池2.5.4 总结2.6

2021-01-22 12:04:47 715

原创 MySQL 索引详解

MySQL 索引详解1. 索引的实现算法1.2 B-Tree1.2 B+Tree2. 索引类型2.1 数据结构角度2.1.1 B-Tree 索引(B+树)2.1.2 Hash 索引(哈希表)2.2 功能应用角度2.2.1 普通索引2.2.2 唯一索引2.2.3 主键索引2.2.4 组合索引2.2.5 全文索引3. 物理存储角度(聚簇索引、非聚簇索引)3.1 聚簇索引 vs 非聚簇索引4. 覆盖索引5. 索引的使用5.1 创建原则5.2 索引的使用原则1. 索引的实现算法  首先不谈 Mysql 怎么实现

2021-01-06 20:30:10 134

原创 MySQL EXPLAIN详解

MySQL EXPLAIN详解1. EXPLAIN详解1.1 EXPLAIN使用1.2 参数解读1.2.1 id 唯一标识1.2.2 select_type 查询类型1.2.3 table 表名1.2.4 partitions 分区1.2.5 type 连接类型1.2.6 possible_keys 可能使用的索引1.2.7 key 实际选择的索引1.2.8 key_len 索引的长度1.2.9 ref 索引引用列1.2.10 rows 扫描的行数1.2.11 filtered 符合查询条件的数据百分比1.

2021-01-04 23:29:29 244

原创 MySQL 慢查询日志

MySQL 慢查询日志1. 数据准备2. 慢查询日志与分析2.1 相关参数2.2 使用方式2.2.1 修改配置文件2.2.2 通过全局变量设置2.3. 分析慢查询日志2.3.1 分析慢查询日志表2.3.2 分析慢查询日志文件TIPS:   本文基于 MySQL 8.0.21,理论支持MySQL 5.0及更高版本。1. 数据准备  本文中的数据使用的是 MySQL 官方提供的测试数据,可以到 github 下载,地址为:https://github.com/datacharmer/test_db,

2021-01-04 19:11:43 79

原创 服务间通讯与调用 - Feign

服务间通讯与调用 - Feign1. 武装到牙齿 - Feign体系架构1.1 上半场 - 构建请求1.2 下半场 - 发起调用2. 大话Feign之动态代理2.1 抢亲小队 - 截胡方法调用2.2 Spring的动态代理3. 理想的Feign风格项目结构3.1 理想结构4. 服务调用的超时重试(底层采用Ribbon)4.1 求极值的参数4.2 极值函数1. 武装到牙齿 - Feign体系架构  大家有没有看过一部叫做《黑衣人》的电影?这部电影讲述了搞笑特工联手对抗外星生物,维护世界和平的故事。里面有

2020-12-08 19:13:50 497

原创 负载均衡 - Ribbon

负载均衡 - Ribbon1. Ribbon体系架构解析2. 懒加载和饥饿加载-一定是环境问题3. 负载均衡策略-七种策略3.1 RandomRule - 随性而为3.2 RoundRobinRule - 按部就班3.3 RetryRule - 卷土重来3.4 WeightedResponseTimeRule - 能者多劳3.5 BestAvailableRule - 让最闲的人来3.6 AvailabilityFilteringRule - 我是有底线的3.7 ZoneAvoidanceRule - 我的

2020-12-07 20:14:50 335

原创 服务容错 - Hystrix

服务容错 - Hystrix1. Hystrix 体系架构与核心功能1.1 服务降级1.2 服务熔断1.3 线程隔离2. 服务降级2.1 服务降级原理解析2.1.1 盯梢名单 - @HystrixCommand2.1.2 锦衣卫工作流程 - 异常捕捉2.2 服务降级常用方案2.2.1 沉默是金 - 静默处理2.2.2 瞒天过海:默认值2.2.3 好好改造:想办法恢复服务2.2.4 一错再错 - 多次降级2.3 Request Cache2.4 超时降级 - 规避与Ribbon共同作用时的坑2.4.1 数学课

2020-12-04 17:12:19 432

原创 服务治理 - Eureka

服务治理 - Eureka1. 什么是服务治理1.1 服务治理的伟大目标1.2 实现目标要先解决问题1.3 服务治理的解决方案2. 注册中心知多少2.1 等待戈多2.2 注册中心的日常任务2.3 戈多报道指南3. 服务注册知多少4. 服务发现-你是我的眼4.1 你是我的眼4.2 谁去打史密斯4.2.1 基于客户端的服务发现4.2.2 基于服务端的服务发现4.2.3 论挨揍的效率5. 心跳监测与服务剔除5.1 感受你的心跳5.1.1 心电图里的信息5.1.2 两个核心指标5.2 服务剔除6. 服务续约-向天再

2020-12-02 20:24:01 533 1

原创 Java8:通过行为参数化传递代码

通过行为参数化传递代码1. 应对不断变化的需求1.1 初试牛刀:筛选绿苹果1.2 再展身手:把颜色作为参数1.3 第三次尝试:对你能先到的每个属性做筛选2. 行为参数化2.1 第四次尝试:根据抽象条件筛选2.1.1 传递代码行为2.1.2 多种行为,一个参数3. 对付啰嗦3.1 第五次尝试:使用匿名类3.2 第六次尝试:使用 Lambda 表达式3.3 第七次尝试:将 List 类型抽象化4. 真实的例子4.1 用 Comparator 来排序4.2 用 Runnable 执行代码5. 总结  在软件工程

2020-07-22 23:23:58 253

原创 42 - 案例分析(四):高性能数据库连接池HiKariCP

案例分析(四):高性能数据库连接池HiKariCP1. 什么是数据库连接池2. FastList 解决了哪些性能问题3. ConcurrentBag 解决了哪些性能问题4. 总结  实际工作中,我们总会难免和数据库打交道;只要和数据库打交道,就免不了使用数据库连接池。业界知名的数据库连接池有不少,例如 c3p0、DBCP、Tomcat JDBC Connection Pool、Druid 等,不过最近最火的是 HiKariCP。    HiKariCP 号称是业界跑得最快的数据库连接池,这两年发展得顺

2020-07-20 00:24:26 758

原创 41 - 案例分析(三):高性能队列Disruptor

案例分析(三):高性能队列Disruptor1. RingBuffer 如何提升性能2. 如何避免“伪共享”3. Disruptor 中的无锁算法4. 总结  我们在《24 - 并发容器》介绍过 Java SDK 提供了 2 个有界队列:ArrayBlockingQueue 和 LinkedBlockingQueue,它们都是基于 ReentrantLock 实现的,在高并发场景下,锁的效率并不高,那有没有更好的替代品呢?有,今天我们就介绍一种性能更高的有界队列:Disruptor。    Disru

2020-07-19 23:29:37 374

原创 40 - 案例分析(二):高性能网络应用框架Netty

案例分析(二):高性能网络应用框架Netty1. 网络编程性能的瓶颈2. Reactor 模式3. Netty 中的线程模型4. 用 Netty 实现 Echo 程序服务端.5. 总结  Netty 是一个高性能网络应用框架,应用非常普遍,目前在 Java 领域里,Netty 基本上成为网络程序的标配了。Netty 框架功能丰富,也非常复杂,今天我们主要分析 Netty 框架中的线程模型,而线程模型直接影响着网络程序的性能。    在介绍 Netty 的线程模型之前,我们首先需要把问题搞清楚,了解网络

2020-07-19 22:31:54 253

原创 39 - 案例分析(一):高性能限流器Guava RateLimiter

案例分析(一):高性能限流器Guava RateLimiter1. 经典限流算法:令牌桶算法2. Guava 如何实现令牌桶算法3. 总结  从今天开始,我们就进入案例分析模块了。 这个模块我们将分析四个经典的开源框架,看看它们是如何处理并发问题的,通过这四个案例的学习,相信你会对如何解决并发问题有个更深入的认识。    首先我们来看看 Guava RateLimiter 是如何解决高并发场景下的限流问题的。Guava 是 Google 开源的 Java 类库,提供了一个工具类 RateLimiter

2020-07-19 18:41:27 416

原创 38 - 生产者-消费者模式:用流水线思想提高效率

生产者-消费者模式:用流水线思想提高效率1. 生产者 - 消费者模式的优点2. 支持批量执行以提升性能3. 支持分阶段提交以提升性能4. 总结  前面我们在《Worker Thread模式:工作线程池》中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式。但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就是生产者 - 消费者模式。    生产者 - 消费者模式在编程领域的应用也非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所

2020-07-19 17:32:45 445

原创 37 - 两阶段终止模式:优雅地终止线程

两阶段终止模式:优雅地终止线程1. 如何理解两阶段终止模式2. 用两阶段终止模式终止监控操作3. 如何优雅地终止线程池4. 总结  前面两篇文章我们讲述的内容,从纯技术的角度看,都是启动多线程去执行一个异步任务。既启动,那又该如何终止呢?今天咱们就从技术的角度聊聊如何优雅地终止线程,正所谓有始有终。    在前面曾讲过:线程执行完或者出现异常就会进入终止状态。这样看,终止一个线程看上去很简单啊!一个线程执行完自己的任务,自己进入终止状态,这的确很简单。不过我们今天谈到的“优雅地终止线程”,不是自己终止

2020-07-19 16:13:42 171

原创 36 - Worker Thread模式:工作线程池

Worker Thread模式:工作线程池1. Worker Thread 模式及其实现2.1 正确地创建线程池2.2 避免线程死锁3. 总结  在上一篇文章中,我们介绍了一种最简单的分工模式——Thread-Per-Message 模式,对应到现实世界,其实就是委托代办。这种分工模式如果用 Java Thread 实现,频繁地创建、销毁线程非常影响性能,同时无限制地创建线程还可能导致 OOM,所以在 Java 领域使用场景就受限了。    要想有效避免线程的频繁创建、销毁以及 OOM 问题,就不得不

2020-07-16 20:59:20 433

原创 35 - Thread-Per-Message模式:委托他人代办

Thread-Per-Message模式:委托他人代办1. 理解 Thread-Per-Message 模式2. 用 Thread 实现 Thread-Per-Message 模式3. 总结  我们曾经把并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,在编程领域,软件的设计过程也是先从概要设计开始,而后才进行详细设计。同样,解决并发编程问题,首要问题也是解决宏观的分工问题。  并发编程领域里,解决分

2020-07-16 20:17:47 140

原创 34 - Balking模式:快速放弃的阻止模式

Balking模式:快速放弃的阻止模式1. Balking 模式的经典实现2. 用 volatile 实现 Balking 模式3. 总结  上一篇《33 - Guarded Suspension模式 等待唤醒机制的规范》文章中,我们提到可以用“多线程版本的 if”来理解 Guarded Suspension 模式,不同于单线程中的 if,这个“多线程版本的 if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。  需要快速放弃的一

2020-07-16 19:11:53 166

原创 33 - Guarded Suspension模式 等待唤醒机制的规范

Guarded Suspension模式 等待唤醒机制的规范1. Guarded Suspension 模式2. 扩展 Guarded Suspension 模式3. Dubbo 源码分析4. 总结  前不久,同事小灰工作中遇到一个问题,他开发了一个 Web 项目:Web 版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,

2020-07-15 23:53:54 199

原创 32 - ThreadLocal 线程本地存储模式 没有共享就没有伤害

ThreadLocal 线程本地存储模式 没有供销就没有伤害1. ThreadLocal 的使用方法2. ThreadLocal 工作原理3. ThreadLocal 与内存泄露3. InheritableThreadLocal 与继承性5. 总结  民国年间某山东省主席参加某大学校庆演讲,在篮球场看到十来个人穿着裤衩抢一个球,观之实在不雅,于是怒斥学校的总务处长贪污,并且发话:“多买几个球,一人发一个,省得你争我抢!”小时候听到这个段子只是觉得好玩,今天再来看,却别有一番滋味。为什么呢?因为其间蕴藏着解

2020-07-12 15:10:10 223

原创 31 - Copy-on-Write模式 不是延迟策略的写时复制

Copy-on-Write模式 不是延迟策略的写时复制1. Copy-on-Write 模式的应用领域2. 真实案例3. 总结  在上一篇文章中我们讲到 Java 里 String 这个类在实现 replace() 方法的时候,并没有更改原字符串里面 value[]数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种 Copy-on-Write 方法。所谓 Copy-on-Write,经常被缩写为 COW 或者 CoW,顾名思义

2020-07-12 10:30:56 206

原创 30 - Immutability模式:利用不变性解决并发问题

Immutability模式:利用不变性解决并发问题1. 快速实现具备不可变性的类2. 利用享元模式避免创建重复对象3. 使用 Immutability 模式的注意事项4. 总结  我们曾经说过,“多个线程同时读写同一共享变量存在并发问题”,这里的必要条件之一是读写,如果只有读,而没有写,是没有并发问题的。  解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就

2020-07-09 20:59:42 279 1

原创 29 - Fork/Join 分治任务模型

Fork/Join 分治任务模型1. 分治任务模型2. Fork/Join 的使用3. ForkJoinPool 工作原理4. 模拟 MapReduce 统计单词数量5. 总结  前面几篇文章我们介绍了线程池、Future、CompletableFuture 和 CompletionService,仔细观察你会发现这些工具类都是在帮助我们站在任务的视角来解决并发问题,而不是让我们纠缠在线程之间如何协作的细节上(比如线程之间如何实现等待、通知等)。对于简单的并行任务,你可以通过“线程池 +Future”的方

2020-07-09 19:43:03 922

原创 28 - CompletionService 批量执行异步任务

CompletionService 批量执行异步任务1. 询价系统1.1 ThreadPoolExecutor + Future1.2 ThreadPoolExecutor + Queue1.3 利用 CompletionService 实现询价系统2. 理解 CompletionService 接口2.1 创建 CompletionService 接口2.2 CompletionService 方法2.3 利用 CompletionService 实现 Dubbo 中的 Forking Cluster3.

2020-07-05 23:51:58 271

原创 27- CompletableFuture 异步编程

CompletableFuture 异步编程1. CompletableFuture 的核心优势1.1 CompletableFuture 使用1.2 创建 CompletableFuture 对象1.3 理解 CompletionStage 接口1.3.1 描述串形关系1.3.2 描述 AND 汇聚关系1.3.3 描述 OR 汇聚关系1.3.4 异常处理  前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作。如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例

2020-07-05 21:22:17 158

原创 26 - Future 获取异步任务的结果

Future 获取异步任务的结果1. 如何获取任务的执行结果1.1 ThreadPoolExecutor.submit1.2 FutureTask 工具类2. 实现最优的“烧水泡茶”程序3. 总结  在上一篇文章《25 - ThreadPoolExecutor 线程池》中,我们详细介绍了如何创建正确的线程池,也粗略了讲了一下如何启动线程池,execute() 和 submit() 都是用来执行线程池任务的,它们最主要的区别是,submit() 方法可以接收线程池执行的返回值,而 execute() 不能接

2020-07-05 10:42:25 3815

原创 25 - ThreadPoolExecutor 线程池

ThreadPoolExecutor 线程池1. 线程池原理2. ThreadPoolExecutor2.1 核心参数2.2 执行流程2.3 启动方式2.4 拒绝策略2.5 自定义拒绝策略2.6 扩展3. 如何设置线程池的大小4. 四种线程池4.1 newCachedThreadPool4.2 newFixedThreadPool4.3 newScheduledThreadPool4.4 newSingleThreadExecutor  虽然在 Java 语言中创建线程看上去就像创建一个对象一样简单,只

2020-07-04 23:19:20 179

原创 24 - 并发容器

并发容器1. 同步容器及其注意事项1.1 同步容器1.2 注意事项2. 并发容器及注意事项2.1 List2.2 Map2.3 Set2.4 Queue  Java 并发包有很大一部分内容都是关于并发容器的,因此学习和搞懂这部分的内容很有必要。  Java 1.5 之前提供的同步容器虽然也能保证线程安全,但是性能很差,而 Java 1.5 版本之后提供的并发容器在性能方面则做了很多优化,并且容器的类型也更加丰富了。下面我们就对比二者来学习这部分的内容。  1. 同步容器及其注意事项1.1 同步容器

2020-07-04 22:47:35 133

原创 23 - Semaphore 信号量

Semaphore 信号量1. Semaphore 模型2. Semaphore 使用3. 源码分析3.1 类结果3.2 acquire3.3 release4. 总结  本篇介绍第三个并发工具类 Semaphore,Semaphore 可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。1. Semaphore 模型  信号量模型还是很简单的,可以简单概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量

2020-07-04 21:06:14 154

原创 22 - CyclicBarrier 一组线程之间相互等待

CyclicBarrier 一组线程之间相互等待1. CyclicBarrier 的使用1.1 主要方法1.2 使用举例1.3 与 CountDownLatch 比较2. 源码分析2.1 类结构2.2 构造器2.3 await3. 对账系统4. 总结1. CyclicBarrier 的使用  CyclicBarrier 要做的事情是让一组线程未到达一个屏障(条件)时被阻塞,直到最后一个线程到达屏障(条件)时,屏障(条件)才会开门,所有被屏障拦截的线程一起执行。  1.1 主要方法CyclicBar

2020-07-04 18:38:09 260

原创 21 - CountDownLatch 让线程等待其他线程完成

CountDownLatch 让线程等待其他线程完成1. CountDownLatch 使用1.1 使用背景1.2 利用并行优化1.3 用 CountDownLatch 实现线程等待2. 源码分析2.1 类结构2.2 await2.3 countDown3. 总结  并发编程中常遇到这种情况,一个线程需要等待另外多个线程执行后再执行。遇到这种情况你一般怎么做呢?今天就介绍一种 JDk 提供的解决方案来优雅的解决这一问题,那就是倒计时器 CountDownLatch。1. CountDownLatch 使

2020-07-04 12:20:47 401

原创 20 - Lock-Condition 的等待通知

Lock-Condition 的等待通知1. condition 的使用1.2 等待方法1.2 唤醒方法1.3 使用举例2. condition 与 wait / notify3. 源码分析3.1 条件队列3.2 await3.3 signal3.4 过程总结4. 生产者消费者5. 总结  在上一篇文章中,我们讲到 Java SDK 并发包里的 Lock 有别于 synchronized 隐式锁的三个特性:能够响应中断、支持超时和非阻塞地获取锁。那今天我们接着再来详细聊聊 Java SDK 并发包里的 C

2020-07-03 20:23:34 117

原创 19 - StampedLock 比读写锁更快的锁

StampedLock 比读写锁更快的锁1. 为什么引入 StamedLock1.1 读写锁的问题1.2 StamedLock2. 三种锁模式2.1 写锁 writeLock2.2 悲观读锁 readLock2.3 乐观读 OptimisticReading3. 使用注意事项4. 源码分析4.1 锁状态4.2 属性4.2.1 锁状态相关属性4.2.2 节点4.3 写锁的获取与释放4.4 悲观锁的获取与释放4.5 乐观读的获取5. 总结  在上一篇《18 - ReentrantReadWriteLock 读

2020-07-01 20:35:59 284

原创 18 - ReentrantReadWriteLock 读写锁

ReentrantReadWriteLock 读写锁1. 读写锁概念1.1 为什么需要读写锁1.2 读写锁原则1.3 读写锁的应用1.4 读写锁的降级2. 源码分析2.1 类结构2.2 记录读写锁的状态2.3 记录获取锁的线程2.4 读锁获取2.4.1 tryAcquireShared 尝试获取读锁2.4.1.1 readerShouldBlock2.4.1.2 fullTryAcquireShared2.4.1.3 doAcquireShared2.4.1.4 setHeadAndPropagate2.5

2020-07-01 15:46:28 218

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除