包含标签 技术 的文章

MyBatis 源码 - Plugin 插件实现过程

MyBatis 的执行过程中主要涉及四个很重要的接口,分别是 Executor、ParameterHandler、ResultSetHandler 和 StatementHandler,为了方便用户在上述接口执行过程中植入增强逻辑,MyBatis 实现了插件支持,即用户可以定义对上述接口的方法拦截逻辑,MyBatis 将通过动态代理将这里逻辑植入到具体接口方法的执行过程中。

……

阅读全文

MyBatis 源码 - Mapper 的动态代理实现过程

在使用 Mabatis 时往往需要有成对出现的 .java 后缀格式 Mapper 接口文件及 .xml 后缀格式的 XML 文件,其中 XML 文件放在资源目录,而 Java 文件自然放在运行目录,通过调用 Mapper 接口中定义的方法就能触发到其通过 namespace 关联的 XML 文件中的 SQL 语句,从而实现了业务逻辑与数据库交互的解耦,避免像传统 JDBC 编程那样在 Java 代码中写 SQL 与数据库交互,那么 Mybtis 是怎么将 Mapper 接口方法与 XML 中 SQL 语句进行绑定与触发的呢?下面我们通过测试方法 debug 调试进行进行代码跟踪。

……

阅读全文

JDK 源码 - ThreadPoolExecutor

ThreadPoolExecutor 是 Java 的线程池实现,其中封装了对线程的管理(包括创建、调度、销毁等)及任务的分配等逻辑,作为核心并发组件,其中使用到了如阻塞队列、ReentrantLock、原子变量等并发包下的基础工具,由于前面看完了 ReentrantLock 等相关的源码,所以尝试窥探下 ThreadPoolExecutor 的工作过程。

……

阅读全文

JDK 源码 - ConcurrentHashMap 1.7

由于 JDK 1.7 的 ConcurrentHashMap 的实现使用到了 ReentrantLock,刚好前面也已经看过了 ReentrantLock 的实现,所以顺势看下 1.7 版本的 ConcurrentHashMap 是如何实现的。

……

阅读全文

JDK 源码 - CountDownLatch

前面已经了解了 AbstractQueuedSynchronizer 和 ReentrantLock 的原理,接下来看看共享锁组件 CountDownLatch 是如何基于 AbstractQueuedSynchronizer 实现,在我看来,如果能先了解 AbstractQueuedSynchronizer 的运作过程,那么再看 CountDownLatch 会觉得比较容易理解。

……

阅读全文

JDK 源码 - ReentrantLock

前面已经或粗或细地看过了 AbstractQueuedSynchronizer 的源码,不妨趁热打铁把其常见的实现的源码也翻一遍,于是我们先来看 ReentrantLock 内部是怎么实现的。

……

阅读全文

JDK 源码 - AbstractQueuedSynchronizer

前段时间线上遇到 OOM 问题,定位到的原因是线程池创建线程的个数过多,导致内存不够用;为此好奇去看了眼线程池的源码,发现线程池会在调度任务执行时才会创建实际的线程对象,但是再往下看时遇到了不懂的东西,比如 AbstractQueuedSynchronizer ,没办法只好先把基础的组件搞明白。

……

阅读全文

聊聊多线程环境下的 HashMap

很久之前我写了这么一个并发异步的工具方法,传入的 suppliers 是具体的业务方法函数引用,考虑这个一个业务场景,我们需要去数据库统计某个表最近一个月在某个条件下的数量,那么为了提高响应效率,可以通过按天切分日期,然后组装成相应的 supplier,再通过多线程异步处理,最后统一收集完结果返回。

……

阅读全文

浅谈 MySQL 的 MVCC 机制

最近公司组织技术分享,因为刚好周末空闲时间在翻译 MySQL 的文档,接触到 MySQL 的 MVCC 机制,于是便选了这个点进行分享,虽然做了 PPT,但还是写个博客,串联一下思路。

……

阅读全文