SPI 在 Java 世界应用非常广泛,如:Dubbo、Spring Boot 等框架。本文从源码入手分析,深入探讨 Java SPI 的特性、原理,以及在一些比较经典领域的应用。...Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。...Java SPI 有四个要素: **SPI 接口:**为服务提供者实现类约定的的接口或抽象类。**SPI 实现类:**实际提供服务的实现类。...**SPI 配置:**Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。...2.3 SPI 配置 如果想通过 Java SPI 机制来发现服务,就需要在 SPI 配置中约定好发现服务的逻辑。
SPI 在 Java 世界应用非常广泛,如:Dubbo、Spring Boot 等框架。本文从源码入手分析,深入探讨 Java SPI 的特性、原理,以及在一些比较经典领域的应用。...你有没有想过,Java SPI 和普通 Java 接口有何不同,Java SPI 是如何工作的。实际上,Java SPI 机制依赖于 ServiceLoader 类去解析、加载服务。...ServiceLoader 的代码本身很精练,接下来,让我们通过走读源码的方式,逐一理解 ServiceLoader 的工作流程。...3.1 ServiceLoader 的成员变量 先看一下 ServiceLoader 类的成员变量,大致有个印象,后面的源码中都会使用到。...我们不妨带着疑问,从源码入手,一步步探究其原理。
Stack这个数据结构还是比较容易理解的,满足LIFO,即先进后出,看下它的结构图,然后分析一下源码进行理解一下。 ?...o.equals(elementData[i])) return i; } return -1; } 以上就是对栈Stack这种LIFO结构的源码进行解析和理解...,到这里就结束了,关于源码走读的示例程序,这里自己也简单的提供一下。...package com.wpw.springbootjuc.java8.map; import lombok.extern.slf4j.Slf4j; import java.util.Stack; /*...Vector源码是进一步理解栈这种结构的前面铺垫,关于Vector源码解析的文章可以参考历史文章。
这一篇文章算是从java基础性文章结束到进阶的一个过渡,虽然自己从未使用过Vector这样的容器进行数据的增删改查操作,但还是按照一贯的思路进行分析一下它的源码。...先简单看下它的结构图,然后看下提供的方法都有哪些,逐步分析每个方法的使用和源码。 ? 默认的无参构造函数,默认初始容量为10。...(o.equals(elementData[i])) return i; } return -1; } 上面主要体现了java...public void clear() { removeAllElements(); } 上面的基本方法,其用法和写法都很优秀,值得学习,后面进行总结的时候会慢慢输出自己对其的理解...package com.wpw.springbootjuc.java8.map; import lombok.extern.slf4j.Slf4j; import java.util.Vector;
键值对集合Map,HashTable都是我们常用的,但是随着多线程环境以及代码的普及,ConcurrentHashMap这样的并发集合也常用了起来,今天我们先来分析一下HashTable的源码。...便于自己理解,这里指的都是自己分析的。 ?...,其它的部分方法就不分析了,用到的很少,接下来继续按照以往的风格贴上一张HashTable的结构图,以及自己源码走读所用到的部分示例程序。...package com.wpw.springbootjuc.java8.map; import lombok.extern.slf4j.Slf4j; import java.util.Collection...; import java.util.Hashtable; import java.util.Set; /** * 源码走读 * * @author wpw */ @Slf4j public
额,本来打算分析队列queue的源码,结果linkedList链表结构没有去分析,导致这里不得不分析linkedList源码了,由于LinkedList数据结构是Queue接口的一种,也是多态的一种体现...,这也是自己最近理解多态概念的一种方式了。...关于源码走读的示例程序: package com.wpw.springbootjuc.java8.map; import lombok.extern.slf4j.Slf4j; import java.util.LinkedList...(String[] args) { //额,本来打算分析队列queue的源码,特么结果linkedList链表结构没有去分析,导致这里不得不分析linkedList源码了...// //由于LinkedList数据结构是Queue接口的一种,也是多态的一种体现,这也是自己最近理解多态概念的全面理解了。
四、源码中的门面模式 3.1 Spring JDBC中的JdbcUtils对原生的JDBC进行封装,让调用者统一访问。...oracle.sql.DATE")) { String metaDataClassName = rs.getMetaData().getColumnClassName(index); if ("java.sql.Timestamp...= null && obj instanceof java.sql.Date) { if ("java.sql.Timestamp".equals(rs.getMetaData().getColumnClassName...在Tomcat源码中搜索Facade(门面): ?
本篇文章针对JAVA中的MMAP的文件映射读写机制,来分析为何很多告诉框架用了这个机制,以及这个机制好在哪里,快在哪里。 本文基于JDK 1.8 JAVA File MMAP原理解析 1....引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据。...通过上面的源码分析,我们可以看到返回的是DirectByteBuffer,但是这个DirectByteBuffer并没有占用到JVM的-XX:MaxDirectMemorySize的空间。...源码解析(4) - 堆外内存、零拷贝、DirectByteBuffer以及针对于NIO中的FileChannel的思考 这个mmap占用的内存是一块独立于JVM之外的,可以进程间共享的内存。...这个不开放也可以理解,因为用户如果主动调用,会导致GC DirectBuffer的时候,报出内存访问异常导致JVM崩溃(如果用户调用了munmap,对应的MappedByteBuffer被GC时,会在被调用一次
e.next = newTable[i]; newTable[i] = e; e = next; } } } 简单理解为
源码分析中的典型应用 Java I/O 中的装饰者模式 Spring Session 中的装饰者模式 Mybatis 缓存中的装饰者模式 二、给系统添加日志,安全、限流示例 一般系统的安全、日志、限流等业务无关代码可以抽离出来...如果读者想看注解功能完整实现,可以参考我的这个项目:SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架 三、源码中的装饰者模式 3.1、Java IO中是体现最明显的装饰者模式
java中AQS是AbstractQueuedSynchronizer类,AQS依赖FIFO队列来提供一个框架,这个框架用于实现锁以及锁相关的同步器,比如信号量、事件等。...管程模型 java使用MESA管程模型来管理类的成员变量和方法,让这个类的成员变量和方法的操作是线程安全的。...下图是MESA管程模型,里面除了定义共享变量外,还定义了条件变量和条件变量等待队列: java中的MESA模型有一点改进,就是管程内部只有一个条件变量和一个等待队列。
源码中的典型应用: Netty 中的 Pipeline和ChannelHandler通过责任链设计模式来组织代码逻辑。...------ 三、源码中的责任链模式 Filter接口有非常多的实现类,这里挑选doFilter方法中的FilterChain参数来看,Tomcat和SpringSecurity中都用到责任链模式: ?
前言 我们平常都会去阅读Java的源码,经常可以在源码中看到for (;;) {}的结构,本文将带你去理解无限循环。...一、无限循环的原理 在Java编程语言中,for (;;) {}是一种特殊的循环结构,被称为无限循环。...2.1服务器端的消息监听: 以下是一个使用Java中for (;;) {}循环的服务器端消息监听的示例代码: import java.io.*; import java.net.*; public...clientSocket.close(); System.out.println("Client disconnected"); } } } 2.2守护线程的执行: 在Java
“尝试通过 nydus[1] 源码理解工作流程。这是第二部分,主要包括 API Server 和 Backend 的流程。 1....DAEMON_CONTROLLER 初始化 接上文 nydusd 源码理解(一),回到process_fs_service函数,创建daemon实例完成后,替换DAEMON_CONTROLLER中daemon
4-8-3.jpg 一、前提 在阅读这篇博客之前,希望你对HashMap已经是有所理解的,如果你对java的cas操作也是有一定了解的,因为在这个类中大量使用到了cas相关的操作来保证线程安全的。...Ⅱ、java内存模型和cas操作 这里我只是简单的说一下java的内存模型和cas,因为这篇文章的主角的ConcurrentHashMap。...java内存模型:在java中线程之间的通讯是通过共享内存(即我们在变成时声明的成员变量或叫全局变量)的来实现的。...事实上已经有其他线程修改过了这个值了,这个就是 A ---> B ---> A 的问题; Ⅲ、获取table对应的索引元素的位置 通过(n-1)& hash 的算法来获得对应的table的下标的位置,如果对于这条公式不是很理解的同学可以到...: jdk1.8源码分析-hashMap 博客中了解。
本文将深入探讨Java中PriorityQueue的底层实现与源码分析,帮助读者更好地理解PriorityQueue的内部原理。...摘要 本文将从PriorityQueue的定义、特性入手,逐步分析其底层实现、源码解析以及应用场景案例、优缺点分析等方面,全面深入地理解PriorityQueue。...最终输出结果为:队列中的元素(从小到大):1 2 3 5 10小结 本文通过对Java中PriorityQueue的定义、特性、底层实现及源码解析进行详细分析,深入探讨了PriorityQueue的内部原理...总结 本文从PriorityQueue的定义、特性和底层实现入手,深入剖析了Java中PriorityQueue的源码和应用场景案例,并对其进行了优缺点分析。...附录源码 如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
Mbatis 日志收集分析 Java开发中经常用到的日志框架有很多,Log4j、Log4j2、slf4j等等,Mybatis定义了一套统一的日志接口供上层使用,并为上述常用的日志框架提供了相应的适配器...为了复用和集成这些第三方日志组件,在其日志模块中,提供了多种Adapter,将这些第三方日志组件对外接口适配成org.apache.ibatis.logging.Log,这样Myabtis 就可以通过Log接口调用第三方日志了 源码分析图...源码剖析 Mybatis Log接口:相当于源接口 package org.apache.ibatis.logging; public interface Log { boolean isDebugEnabled
2.基础介绍 ThreadPoolExecutor得7个参数 ThreadPoolExecutor最常用的构造方法有7个参数如下: 1.corePoolSize(核心线程数),核心线程数可以理解为公司的人员...2.maximumPoolSize(最大线程数),最大线程数可以理解为公司最多的员工能达到多少,包括了外包人员。...3.keepAliveTime(非核心线程存活时间),非核心线程可以理解为公司的外包人员,存活时间就是指外包在公司最多只能待多久时间,超过这个时间就要离开。...4.unit(非核心线程存活时间单位) 5.workQueue(任务队列),任务队列是指线程提交的任务存放的地方,可以理解为公司的需求量太大,此时本部人员忙不过来了。...其中拒绝策略能够进行自定义,Java中提供的4中拒绝策略如下。
ConcurrentHashMap源码分析 其实ConcurrentHashMap我自己已经看过很多遍了,但是今天在面试阿里的时候自己在描述ConcurrentHashMap发现自己根本讲不清楚什么是ConcurrentHashMap...,以及里面是怎么实现的,搞的我突然发现自己什么都不懂,所以我想要再次的来分析一下这个源码,完全理解ConcurrentHashMap,而不是以为自己懂了,实际上自己不懂。...break; } } } addCount(1L, binCount); return null; } 解释一下上面的源码做了什么
领取专属 10元无门槛券
手把手带您无忧上云