源码学习
文章平均质量分 58
JDK源码和框架源码
AlbenXie
这个作者很懒,什么都没留下…
展开
-
《Effective Java, Third Edition》笔记
1、使用依赖注入取代硬连接资源使用依赖注入替代硬连接资源,依赖注入提供了灵活性和可测试性。虽然下方的实例仍是一个基础资源,但是它由外部类提供,这样保证了我们的SepllChecker提供的功能不变,但是数据却是灵活多变的。/** * 使用依赖注入替代硬资源连接 * * @since 2020-01-12 */public class SpellChecker03 { private final Lexicon dictionary; //需要检查什么资源,由外部类提供原创 2023-04-20 22:44:18 · 84 阅读 · 0 评论 -
使用idea查看源码小技巧
1、查看方法调用的时序图选中方法名-->右键-->sequence diagram插件2、查看类的继承关系图右键-->diagram-->show diagram原创 2021-07-18 13:46:28 · 764 阅读 · 0 评论 -
面试题系列:Java 夺命连环16问
说好了面试系列已经完结了,结果发现还是真香,嗯,以为我发现我的Java基础都没写,所以这个就算作续集了,续集第一篇请各位收好。说说进程和线程的区别?进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。转载 2021-06-05 21:29:45 · 493 阅读 · 0 评论 -
手写一个线程池
前言和设计模式一样,打算花三个月的时间,结合《Java并发编程实战》一书,来总结下并发方面的知识。第一章从线程池的原理开始总结,希望自己能坚持下来,加油!1. 如何实现一个线程池?线程池的概念这里不多说,在讲它的原理前,我们先自己想一下,如果我来写,那如何实现一个线程池?1.1 线程池的重要变量首先要定义一个存放所有线程的集合;另外,每有一个任务分配给线程池,我们就从线程池中分配一个线程处理它。但当线程池中的线程都在运行状态,没有空闲线程时,我们还需要一个队列来存储提交给线程池的任务。转载 2020-11-09 18:04:30 · 432 阅读 · 1 评论 -
String的replace()与replaceAll()区别
以为replaceAll()就是替换全部,其实不然。其实replace()和replaceAll()都是都是替换全部,只是参数不同:replace()是匹配的字符串 replaceAll()是匹配的正则表达式例子:String a = "1.0.3";String replace = a.replace(".", "");String replace1 = a.replaceAll(".", "");String replace2 = a.replaceAll("\\.", "");转载 2020-09-30 14:15:59 · 1066 阅读 · 0 评论 -
详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
前言SpringMVC是目前主流的Web MVC框架之一。如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.htmlSpringMVC中Controller的方法参数可以是Integer,Double,自定义对象,ServletRequest,ServletResponse,ModelAndView等等,非常灵活。本文将分析SpringMVC是如何对这些参数进行处理的,使读.转载 2020-09-14 10:28:13 · 666 阅读 · 0 评论 -
简单模拟Ttomcat
新建一个空的java项目。客户端发送的是一些字节数组,需要对字节数组进行解析后放入到IO流中。所以,新建request和response这两个对象==>>Myrequest&Myresponse。回顾一下http协议中请求所包含的内容,并对这些内容进行解析。package com.mashibing;import java.io.InputStream;/** * @author msb * @version : 1.0 *请求类 */public cl.原创 2020-07-16 20:18:43 · 297 阅读 · 0 评论 -
Spring最深处——ASM
1.ASMASM官网—官方文档ASM是什么ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。ASM能做原创 2020-07-16 20:12:51 · 1576 阅读 · 0 评论 -
模拟(手写)ArrayList
1、自定义异常类IllegalArgumentMyException类package com.example.demo.collection;/** * @Description 自定义非法参数异常 * @Auther gf.x * @Date 2020/5/24 15:38 */public class IllegalArgumentMyException extends RuntimeException{ public IllegalArgumentMyExcept原创 2020-06-03 20:24:52 · 400 阅读 · 0 评论 -
Java数组及数组工具类Arrays的使用
package com.example.demo;import org.junit.Test;import java.util.Arrays;/** * @Description 数组工具类Arrays的使用 * @Auther gf.x * @Date 2020/5/16 18:58 */public class TestArrays { //1. System.arraycopy()数组复制方法 @Test public void test() { .原创 2020-05-19 22:09:40 · 444 阅读 · 0 评论 -
Java字符串的热点问题
1、对那些安全敏感的信息,为什么用char[]存储要优于String?String是不可变的,这就意味着它一旦被创建,就将永久驻留在内存中,直到垃圾回收器将其回收为止。然而用数组存储方式,你可以明确地改变数组中的元素,因此用数组方式,安全信息将有可能不存在系统内存的任何地方。2、能否用字符串来声明switch语句?JAVA 7及以后的版本是支持的。在JDK 7中,允许你使用字符串做switch语句的比较条件。jdk 6以前的版本,不能这样使用:// java 7 only!switch转载 2020-05-17 19:44:13 · 265 阅读 · 0 评论 -
Java中创建对象的5种方式
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。1.使用new关键字这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。Employee emp1 = new Employe转载 2020-05-17 19:06:39 · 302 阅读 · 0 评论 -
十二种获取Spring的上下文环境ApplicationContext的方法
方式一:使用实例:UserDao userDao = (UserDao)SpringUtil.getBean(“userDao”);public class SpringUtil { public static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); public static Object getBean(String s转载 2020-05-17 18:50:34 · 1240 阅读 · 0 评论 -
Java数组和数据工具类Arrays的使用
package com.example.demo;import org.junit.Test;import java.util.Arrays;/** * @Description 数组工具类Arrays的使用 * @Auther gf.x * @Date 2020/5/16 18:58 */public class TestArrays { //1. System.arraycopy()数组复制方法 @Test public void test() { .原创 2020-05-17 18:24:29 · 337 阅读 · 0 评论 -
Java中的位运算左移右移详细分析
1、快速了解Java中的 << 和 >> 和 >>>正数:r = 20 << 1 20的二进制补码:0001 0100 向左移动两位后:0101 0000 结果:r = 40正数:r = 20 >> 1 20的二进制补码:0001 0100 向右移动两位后:0000 0101 结果:r = 102、详细解释<<表示左移移,不分正负数,低位补0; ...转载 2020-05-17 17:13:46 · 1332 阅读 · 1 评论 -
手写ArrayList(非常简单)
1、自定义异常类package com.example.demo.myCollection;/** * @Description 数组索引越界异常类 * @Auther gf.x * @Date 2020/5/13 19:09 */public class IndexOutOfBoundsMyException extends RuntimeException { private static final long serialVersionUID = -407752045512原创 2020-05-15 18:10:20 · 591 阅读 · 0 评论 -
SpringBoot自定义starter
一、自定义starter前要了解的1、这个场景需要使用到的依赖是什么?2、如何编写自动配置@Configuration//指定这个类是一个配置类@ConditionalOnXXX//在指定条件成立的情况下自动配置类生效@AutoConfigureAfter//指定自动配置类的顺序@Bean//给容器中添加组件@ConfigurationPropertie //...原创 2020-04-25 22:44:56 · 387 阅读 · 0 评论 -
SpringBoot启动流程
几个重要的事件回调机制配置在META-INF/spring.factoriesApplicationContextInitializerSpringApplicationRunListener只需要放在ioc容器中ApplicationRunnerCommandLineRunner启动流程:1、创建SpringApplication对象initialize(so...原创 2020-04-24 22:06:28 · 274 阅读 · 0 评论 -
Spring Boot 2.x 启动全过程源码分析(全)
上篇《Spring Boot 2.x 启动全过程源码分析(一)入口类剖析》我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我们继续往下面分析其核心 run 方法。SpringApplication 实例 run 方法运行过程/*** Static helper that can be used to run a {@lin...转载 2020-04-24 01:34:34 · 462 阅读 · 0 评论 -
Spring Boot 有哪几种读取配置的方式?
Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量。Spring Boot读取配置的几种方式:读取application文件在application.yml或者properties文件中添加:info.address=USAinfo.company=Spring...原创 2020-04-24 00:31:20 · 1195 阅读 · 0 评论 -
如何在 Spring Boot 启动的时候运行一些特定的代码?
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。Spring Boot Runner启动器:Runner启动器如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLineRunner,这两个接口实现方式一样...原创 2020-04-23 19:29:28 · 3719 阅读 · 0 评论 -
@Conditional、@ConditionalOnClass 等条件注解的作用
(1)例子说明(2)编码思路(3)编写条件类WindowCondition和LinuxCondition(4)编写接口CmdService以及两个实现类(5)编写配置类,根据条件进行注入不同的类(6)编写测试代码(7)Spring提供的Condition(8)题外话:怎么在Condition中获取application.properties的配置项转载 2020-04-23 16:53:56 · 5313 阅读 · 2 评论 -
@ConfigurationProperties 的作用
springBoot目录@ConfigurationPropertiesspring-boot 提供该注解将配置文件的值映射到类上使用。例子:1、这是我们在application.yml配置的druid连接池学习2、通过@ConfigurationProperties注解则会将值映射到该类中3、通过@Autowired标签即可访问到该对象,不过在使用之前必须在使用类上面...转载 2020-04-23 16:13:26 · 1244 阅读 · 0 评论 -
@EnableConfigurationProperties 的作用
先说作用:@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。说明:如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfiguratio...转载 2020-04-23 16:04:02 · 27271 阅读 · 2 评论 -
@Configuration作用
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。@Configuration标注在类上,相当于把该类作为s...转载 2020-04-23 15:57:44 · 559 阅读 · 0 评论 -
Spring Boot面试杀手锏:自动配置原理(重新理解)
引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。Spr...转载 2020-04-23 15:48:49 · 461 阅读 · 0 评论 -
SpringBoot自动配置的实现原理(重新理解)
之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配置的功能,我们编写一个最简单的自动配置功能,大概的总结一下.一,配置属性类其实就是值对象注入的方式去配置一些Spring常用的配置,我们编写一个最简单的配置对象。@Configurati...转载 2020-04-23 15:24:22 · 473 阅读 · 1 评论 -
轻松搞懂Java中的自旋锁
前言在之前的文章《一文彻底搞懂面试中常问的各种“锁”》中介绍了Java中的各种“锁”,可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会“自旋锁”。正文出现原因在我们的程序中,如果存在着大量的互斥同步代码,当出现高并发的时候,系统内核态就需要不断的去挂起线程和恢复线程,频繁的此类操作会对我们系统的并发性...转载 2020-04-01 16:48:56 · 459 阅读 · 0 评论 -
Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
一、深入JVM锁机制:synchronizedsynrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁...转载 2020-04-01 16:00:25 · 502 阅读 · 0 评论 -
一文带你理解Java中Lock的实现原理
当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章发给他。在这里...转载 2020-04-01 15:04:40 · 838 阅读 · 0 评论 -
高级开发必须理解的Java中SPI机制
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载...转载 2020-04-01 13:45:03 · 372 阅读 · 0 评论 -
究竟什么是可重入锁?
经历很久之前就听说了可重入锁,可重入锁究竟是什么意思,以前是囫囵吞枣的,只要记住ReentrantLock和sychronized是可重入锁就行了,爱咋用咋用,好吧,原谅我的无知,最近对基础查漏补缺,发现竟然对其一问三不知,赶紧预习一波,觉得有必要写一篇博客来讲解,就当做什么都没有发生吧,嘿嘿。。。释义广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并...转载 2020-04-01 13:39:52 · 404 阅读 · 0 评论 -
Java锁Synchronized和Lock比较
对于Lock与synchronized的区别1、Lock能够完成synchronized所实现的所有功能,并且提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。如果使用synchronized,如果A不释放,B将一直等下去,不能被中断。 如果使用ReentrantLock,如果A不释放,可以使B在等...转载 2020-04-01 13:10:11 · 533 阅读 · 1 评论 -
Java自旋锁及几种实现
1、什么是自选锁自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。2、为什么要使用自旋锁多个线程对同一个变量一直使用CAS操作,那么会有大量修改操作,从而产生大量的缓存一致性流量,因为每一次CAS操作都会发出广播通知其他处理器,从而影响程序的性能。3、线程自旋与线程阻塞阻塞的缺点显而易见,线程一旦进入阻塞(...转载 2020-04-01 12:56:17 · 902 阅读 · 0 评论 -
自旋锁以及Java中的自旋锁的实现
什么是自旋锁多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。问题引入:获取到资源的线程A对这个资源加锁,其他线程比如B要访问这个资源首先要获得锁,而此时A持有这个资源的锁,只有等待线程A逻辑执行完,释放锁,这个时候B才能获取到资源的锁进而获取到该资源。这个过程中,A一直持有着资源的锁,那么没有获取到锁的其他线程比如B怎么办?通常就...转载 2020-04-01 12:47:08 · 855 阅读 · 0 评论 -
既然有 HTTP 请求,为什么还要用 RPC 调用?
首先 RPC 框架配置复杂,如果走 HTTP 请求同样也能做到相同功能,而且配置可以几乎为零配置。项目也不用引用太多的包。虽然如果单纯用 RPC,可以不用类似于 Servlet 的 Web 标准。这个回答里恰巧讲了一些rpc通信协议的细节,但是强调一遍通信协议不是rpc最重要的部分,不要被这个回答带偏了。如果要了解rpc请更多的去了解服务治理(soa)的一些基本策略,推荐去看看dubbo的文...转载 2020-04-01 09:24:40 · 1797 阅读 · 0 评论 -
Java的BIO和NIO很难懂?用代码实践给你看,再不懂我转行!
1、引言这段时间自己在看一些Java中BIO和NIO之类的东西,也看了很多博客,发现各种关于NIO的理论概念说的天花乱坠头头是道,可以说是非常的完整,但是整个看下来之后,发现自己对NIO还是一知半解、一脸蒙逼的状态(请原谅我太笨)。基于以上原因,就有了写本文的想法。本文不会提到很多Java NIO和Java BIO的理论概念(需要的话请参见本文的“相关文章”一节),而是站在编码实践的角度,...转载 2020-03-29 15:24:52 · 680 阅读 · 2 评论 -
基于NIO的Socket通信示例讲解
一、NIO的简介Java NIO( non-blocking IO)是从Java 1.4版本开始引入的一个新的IO API,Java NIO提供了与标准IO不同的IO工作方式:IO NIO 面向流 面向缓冲区 阻塞 非阻塞 1. 面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每...转载 2020-03-29 15:22:00 · 472 阅读 · 0 评论 -
Java nio 实现socket异步通信
在原有基础上考虑了编码与解码的问题,还有消息发送的两个重要方法调用疏忽public abstract int write(ByteBuffer src)将字节序列从给定的缓冲区中写入此通道。public abstract int read(ByteBuffer dst)将字节序列从此通道中读入给定的缓冲区。下面代码在关闭连接时还有问题,服务器可以与客户端断开,但是...转载 2020-03-29 15:03:30 · 626 阅读 · 0 评论 -
synchronized的底层原理(三)
Java对象头与Monitorjava对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。对象头包含两部分:Mark Word 和 Class Metadata Address其中Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的Mark Word默认存储结构由...转载 2020-03-25 18:07:57 · 298 阅读 · 0 评论