Lombok 原理与实现

2021-12-29
阅读 22 分钟
8.5k
本文主要包含以下内容:Lombok 的实现机制分析。插入式注解处理器的说明及使用。动手实现 lombok 的 @Getter 和 @Setter 注解。配置 IDEA 以调试 Java 编译过程。1. Lombok官网介绍:Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write an...

阅读 MyBatis 源码:数据库连接池 PooledDataSource

2021-09-08
阅读 39 分钟
6.2k
在 MyBatis 中,使用 PooledDataSource 数据源作为连接池对象,在连接池中存储的是 PooledConnection 对象。通过动态代理,实现对原始连接对象的复用,以及多线程下数据库连接之间的隔离。

阅读 MyBatis 源码:插件开发

2021-09-07
阅读 13 分钟
2.3k
上一篇文章介绍了 MyBatis 执行 SQL 查询的流程,对源码中的关键类如 Configuration、Executor、StatementHandler 有了一定认识之后,本篇聊聊 MyBatis 的插件机制。

阅读 MyBatis 源码:SQL 执行过程

2021-08-31
阅读 25 分钟
3.1k
上一篇文章介绍了 JDBC 实现 SQL 查询的原理 ,本文通过一个简单的 MyBatis 查询示例,探究 MyBatis 执行 SQL 查询的代码流程。本文基于 MyBatis 3.5.7。1. 使用示例工程结构:简单查询例子: {代码...} 2. 源码分析2.1 解析配置文件2.1.1 解析 mybatis-config.xmlMyBatis XML 配置文件例子如下,更多说明见官方文档-XML...

JDBC 基本流程源码分析

2021-08-26
阅读 22 分钟
8.6k
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

Java 实现数学公式的正则校验和结果计算

2021-07-14
阅读 10 分钟
9.6k
假设内置变量为:height、length、width、num。对于公式字符串如 (length*(1+width)/height)*num,需要校验公式格式是否合法,然后对变量进行赋值,计算公式的运算结果。

阅读 JDK 源码:线程池 ThreadPoolExecutor

2021-05-16
阅读 33 分钟
3.1k
上一篇文章介绍了 Thread 类,可知线程随着任务的执行结束而被销毁。但是,由于线程的创建与销毁操作涉及到系统调用,开销较大,因此需要将线程的生命周期与任务进行解耦。使用线程池来管理线程,可以有效地重复利用线程来执行任务。本文将介绍线程池最基础的实现类 ThreadPoolExecutor。

阅读 JDK 源码:线程类 Thread

2021-05-14
阅读 24 分钟
2.8k
在 Java 中,使用 Thread 类可以在操作系统层面创建线程,并绑定到对应的 Thread 类实例中。利用线程异步地执行任务,是并发编程的基础。本文通过阅读 Thread 源码,了解线程状态的定义,线程调度的相关方法,以及对线程中断的处理等。

阅读 JDK 源码:异步任务 FutureTask

2021-05-03
阅读 19 分钟
7.8k
在 Java 中,Runnable 接口表示一个没有返回结果的任务,而 Callable 接口表示具有返回结果的任务。在并发编程中,异步执行任务,再获取任务结果,可以提高系统的吞吐量。Future 接口应运而生,它表示异步任务的执行结果,并提供了检查任务是否执行完、取消任务、获取任务执行结果等功能。FutureTask 是 Future 接口的基...

阅读 JDK 源码:读写锁 ReentrantReadWriteLock

2021-05-01
阅读 27 分钟
1.6k
ReentrantReadWriteLock 中定义了两个锁:共享锁 readLock 和独占锁 writeLock。共享锁 readLock 用于读操作,能同时被多个线程获取;独占锁 writeLock 用于写入操作,只能被一个线程持有。读锁、写锁均具有公平模式、非公平模式两种获取锁的方式。

阅读 JDK 源码:可重入锁 ReentrantLock

2021-04-28
阅读 14 分钟
1.3k
前几篇文章介绍了 AQS(AbstractQueuedSynchronizer)中的独占模式和对 Condition 的实现,这一篇文章来聊聊基于 AQS 框架实现的锁工具:ReentrantLock。

阅读 JDK 源码:AQS 对 Condition 的实现

2021-04-25
阅读 18 分钟
1.4k
前两篇文章分别介绍了 AQS 框架中的独占模式和共享模式,本篇将介绍 AQS 对 Condition 接口的实现。在阅读本篇之前,建议先了解 AQS 中的数据结构和独占模式的实现原理。

阅读 JDK 源码:AQS 中的共享模式

2021-04-25
阅读 5 分钟
2.3k
AbstractQueuedSynchronizer,简称 AQS,是一个用于构建锁和同步器的框架。上一篇文章 介绍了 AQS 的数据结构和独占模式的实现原理,本篇介绍 AQS 共享模式的实现原理。

阅读 JDK 源码:AQS 中的独占模式

2021-04-25
阅读 17 分钟
1.4k
AbstractQueuedSynchronizer,简称 AQS,是一个用于构建锁和同步器的框架。JUC 包下常见的锁工具如 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 都是基于 AQS 实现的。本文将介绍 AQS 的数据结构及独占模式的实现原理。

阅读 JDK 源码:传递队列 LinkedTransferQueue

2021-04-19
阅读 23 分钟
1.5k
LinkedTransferQueue 是一个由链表结构组成的无界阻塞 TransferQueue 队列。接口 TransferQueue 和实现类 LinkedTransferQueue 从 Java 7 开始加入 J.U.C 之中。

阅读 JDK 源码:松弛队列 ConcurrentLinkedQueue

2021-03-29
阅读 11 分钟
2.6k
ConcurrentLinkedQueue 是一个由链表结构组成的无界非阻塞队列,是 JDK 中唯一一个并发安全的非阻塞队列,使用无锁算法来保证线程安全。为了减少 CAS 操作造成的资源争夺损耗,其链表结构被设计为“松弛”的(Slack)。本文对 ConcurrentLinkedQueue 的入队和出队过程进行图解,直观展示其内部结构。

阅读 JDK 源码:传递队列 SynchronousQueue

2021-03-29
阅读 18 分钟
2.3k
SynchronousQueue 是一个由链表或栈结构组成的阻塞队列,采用无锁算法,并发安全。每个线程的存入操作必须等待一个取出操作与之匹配(反之亦然),否则当前线程将阻塞在队列中等待匹配。适用于传递性场景,即生产者线程处理的数据直接传递给消费者线程。

阅读 JDK 源码:WeakHashMap 和 Reference、ReferenceQueue

2021-03-19
阅读 17 分钟
3.3k
WeakHashMap 是一种特殊的 HashMap,它的 key 为 WeakReference 弱引用,并且内置了一个 ReferenceQueue 用于存储被回收的弱引用。阅读 WeakHashMap 源码之前,需要先理解 Reference 和 ReferenceQueue 的机制。理解其基本原理之后,可以使用 HashMap 达到跟 WeakHashMap 一样的效果,文末提供了示例。

阅读 JDK 源码:ConcurrentHashMap 扩容总结 (发现源码的BUG!)

2021-03-02
阅读 21 分钟
4.7k
这段时间阅读了 JDK 8 的 ConcurrentHashMap 源码,其中扩容的过程涉及技术点繁多,很有必要自己动手对扩容原理进行梳理总结。本文中,我对关键代码编写了单元测试,并且找来了图例,方便理解。编写文章过程,我竟然发现了 JDK 8 版本扩容时对 sizeCtl 的判断有 BUG,具体在第 3.4 节中说明。

阅读 JDK 源码:HashMap 扩容总结及图解

2021-03-01
阅读 10 分钟
5.6k
在 Java8 中,HashMap 由数组+链表+红黑树组成的。扩容时,数组容量翻倍,数组中每一个桶中的多个节点(链结构或树结构)都需要 rehash 迁移到新的数组中去。本文通过阅读 HashMap 的 resize 方法了解其扩容原理,对桶节点的迁移算法进行单元测试,画图以方便理解。

HashMap 中的取模和扩容公式推导

2021-02-27
阅读 4 分钟
6.5k
为什么 HashMap 容量 capacity 大小是 2 的 n 次幂?为什么使用 e.hash & (capacity - 1) 位运算作取模公式?为什么扩容时使用 e.hash & oldCap 来计算扩容后的数组索引?本文通过推导 HashMap 中的取模和扩容公式以回答上述问题。

Java 中的参数传递和引用类型

2018-09-11
阅读 11 分钟
11.9k
本文主要分三部分介绍 Java 中的值、指针与引用的概念。第一部分从编程语言的三种参数传递方式入手,阐释“为什么 Java 中只有值传递”。第二部分排除自动装箱和自动拆箱的干扰,理解 Integer 等封装类作为参数传值的情形。第三部分通过简单的示例,展示强引用、软引用、弱引用和虚引用之间的区别。

CAS 5.2.x 单点登录 - 实现原理及源码浅析

2018-03-26
阅读 9 分钟
17.9k
上一篇文章简单介绍了 CAS 5.2.2 在本地开发环境中搭建服务端和客户端,对单点登录过程有了一个直观的认识之后,本篇将探讨 CAS 单点登录的实现原理。

CAS 5.2.x 单点登录 - 搭建服务端和客户端

2018-03-19
阅读 10 分钟
27.8k
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。