自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 问答 (3)
  • 收藏
  • 关注

原创 XV6 Network解析-1

对xv6网卡初始化部分的解析

2022-11-14 20:43:42 1101

原创 MIT 6.S081 lab3-pgtbl

MIT 6.S081 2020 lab3 pgtbl

2022-09-16 23:20:31 504

转载 Java位运算及补码存储

一、原码形式存储首先,原码是站在用户角度的,是原始的二进制!求原码步骤:用户的数字分为正负数,需要有一位存储符号最高位为符号位:0为正,1为负左边是高位,右边是低位由原码的计算方式可以发现源码存储会引发2个问题:(1)0有两个存储方式我们以char型(占1字节,8位)为例(下同):+0: 0000 0000-0: 1000 0000不难发现+0和-0的原码...

2019-12-05 21:27:21 251

转载 jpa2.x的getOne()/findOne()/findById()的区别及使用

查看API发现getOne()方法返回的是实体对象的代理对象(a reference),源码如下: /** * Returns a reference to the entity with the given identifier. * * @param id must not be {@literal null}. * @return a re...

2019-11-23 19:55:51 469

原创 字符串常量池

引言在JDK7之后,字符串常量池从Perm区移到了堆中,运行时常量池剩下的常量,如CONSTANT_class_info,CONSTANT_Fieldref_info 等,还存放在Perm区。在JDK8中,HotSpot移除了Perm区用Metaspace(元空间)代替,此时,字符串常量池还是存放在堆中,运行时常量池放入了Metaspace中。String的编译优化如果两个final常量相加...

2019-11-22 22:51:51 258

原创 注解Spring AOP源码解析

@EnableAspectJAutoProxy如果需要开启aop功能,那么通常都在主配置类添加 @EnableAspectJAutoProxy 注解,这个注解会为我们在容器中导入一个 AspectJAutoProxyRegistrar 组件。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Im...

2019-11-20 22:33:14 131

原创 详解Spring注解版 获取所有需要管理的BeanDefinition

注册ConfigurationClassPostProcessor跟踪AnnotationConfigApplicationContext的构造方法,进入到了下面这个方法 public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.sc...

2019-11-14 16:23:27 858

转载 volatile关键字解析

在聊volatile的原理前,有必要先了解下内存屏障是什么。内存屏障它是一个CPU指令。通俗来讲,它能确保一些特定操作执行的顺序,并且可以影响一些数据的可见性(可能是某些指令执行后的结果)。编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。内存屏障另一个作用是强制更新一次...

2019-11-12 11:31:04 93

原创 synchronized关键字解析

synchronized的用法相信大家的不会陌生,那么来聊聊底层的一些东西。synchronized同步方法通过反编译后,可以发现JVM通过在方法访问标识符(flags)中加入ACC_SYNCHRONIZED来实现同步功能。public synchronized static void test1(){}public static synchronized void test1(); ...

2019-11-11 18:23:43 134

原创 Spring循环引用的处理

在下面挑出了几个重要的方法来进行分析。doGetBean protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansExce...

2019-11-10 17:07:43 440 1

转载 java反射原理解析

There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread

2019-11-06 20:40:27 221

转载 Java基础 — 接口

变量接口中的变量默认为 public static final 变量,并且只能是 public,用 private 修饰会报编译错误。方法Java8之前方法会被隐式的指定为public abstract,并且只能是 public abstract,其他修饰符都会报错。在之后可以定义两类实体方法:定义静态方法在接口中定义的静态方法,不是抽象的,具体实现的,可以直接使用接口...

2019-10-31 15:14:20 89

转载 MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理

MAC地址表说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。交换机的工作原理 交换机在接收到数据帧以后,首先、会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着、会检查自己的MAC表中是否...

2019-10-28 22:52:00 892

转载 内核线程,轻量级进程,用户线程

内核线程内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。内核线程只运行在内核态,不受用户态上下文的拖累。 处理器竞争:可以在全系统范围内竞争处理器资源; 使用资源:唯一使用的...

2019-10-23 23:09:27 240

原创 ReentrantLock acquire方法源码解析

public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();}acquire方法首先判断获取锁是否成功,也就是tryAcquire方法的作用,以N...

2019-10-18 16:12:57 949

转载 字面量、简单名称、描述符、全限定名及符号引用

1.字面量字面量表示源代码中一个固定值的表示法,比如数字1就是字面量,字符串也是字面量; Java中有整数字面量,浮点数字面量,布尔型字面量,字符字面量,字符串字面量。2.简单名称没有类型和参数修饰的方法或字段名称public class Te...

2019-10-14 16:38:22 915

原创 ThreadLocal的实现原理

概述ThreadLocal是一个本地线程副本变量工具类,如果你创建了一个ThreadLocal变量,那么访问这个变量的线程都会有这个变量的本地副本。它主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量不互相干扰,在高并发场景下,可以实现无状态的调用,适合于各个线程依赖不同的变量值的操作场景。类图Thread类中有内部类ThreadLocalMap,它类型是Has...

2019-10-10 20:28:56 148

转载 G1收集器STAB详解

概述STAB全称Snapshot-At-The-Beginning,由字面理解,是GC开始时活着的对象的一个快照。它是通过Root Tracing得到的,作用是维持并发GC的正确性。 那么它是怎么维持并发GC的正确性的呢?根据三色标记算法,我们知道对象存在三种状态:白:对象没有被标记到,标记阶段结束后,会被当做垃圾回收掉,即灰色节点的子节点。 灰:对象被标记了,但是它的field还没有被...

2019-10-07 17:01:06 6386 2

转载 JVM 安全点介绍

什么是安全点?在 JVM 中如何判断对象可以被回收 一文中,我们知道 HotSpot 虚拟机采取的是可达性分析算法。即通过 GC Roots 枚举判定待回收的对象。那么,首先要找到哪些是 GC Roots。有两种查找 GC Roots 的方法:一种是遍历方法区和栈区查找(保守式 GC)。一种是通过 OopMap 数据结构来记录 GC Roots 的位置(准确式 GC)。很明...

2019-10-04 18:41:02 331

原创 死锁

死锁什么是死锁死锁是指当两个或多个线程在并发中互相持有对方所需要的资源且不释放,导致所有线程都无法继续前进,导致程序进入阻塞。最简单的例子就是A线程持有锁1,需要锁2,而B线程持有锁2,需要锁1,这样两个线程都无法前进。死锁的影响当一组Java线程发生死锁时,这些线程就无法再使用了,根据线程完成工作的不同,可能造成程序完全停止,或者性能降低。JVM是无法自动处理,唯一恢复的方...

2019-09-28 15:43:05 106

原创 JMM内存模型

概述JMM,全名为Java Memory Model,即Java内存模型。它是一组规范,需要各个JVM的实现来遵守JMM规范,它屏蔽了各种硬件和操作系统的内存访问差异,以实现Java程序在各个平台下都能达到一致的内存访问效果。不像C/C++那样直接访问物理硬件和操作系统的内存模型,它的主要目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码重排序、处理器会对代码...

2019-09-26 23:16:39 5319 2

原创 Java内部类持有外部类的引用

在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收。通过反编译我们可以来验证这个理论。public class Outer { private String name; class Inner{ private String test; }}Outer是一个普通的类,它有一个...

2019-09-22 17:17:16 1230

原创 简单分析Java线程中断

停止线程原理:使用interrupt来通知,而不是强制。在用户主动取消,或需要服务快速关闭以及运行超时或出错时,需要主动停止线程。Java语言没有一种机制来安全正确的停止线程,但是提供了interrupt来通知另一个线程来停止当前的工作。在Java中,最好的停止线程的方式是使用中断interrupt,但是这仅仅是会通知到被终止的线程“你该停止运行了”,被终止的线程自身拥有决定权(决定是...

2019-09-10 21:36:44 235

原创 实现多线程的正确姿势

实现多线程的方法实现多线程的方法只有2种,这个答案也是oracle在Java官方文档中写明的,见下图。There are two ways to create a new thread of execution.One is to declare a class to be a subclass of Thread.The other way to create a thread i...

2019-09-08 21:42:07 139

原创 微信开发之微信网页授权获取openid

开发前的准备1. 设置授权回调域名关于授权的说明,见下面开发文档的截图重点在设置时不能以http://等协议开头 必须是全域名,不可以是二级域名或是某个文件在这里我使用的微信的测试号注册后点击修改上面红框,设置域名即可。同时我们需要授权回调可以回调到我们自己的电脑,这就需要用到内网穿透,本人使用的是NATAPP,这样就能在开发环境下让微信能访问到我们的域名。...

2019-09-02 17:47:53 2316 3

转载 解决Parameter 'xxxList' not found. Available parameters are [Collection,list]

在使用foreach语句时会经常报Parameter ‘ordersList’ not found. Available parameters are [Collection,list]这个错误,造成这个错误的主要原因你的写法错误:请看错误实例mapper接口中List<Orders> selectKeyList(List<Integer> ordersLi...

2019-08-30 20:28:34 43196 2

原创 Spring Boot嵌入式Servlet容器自动配置原理

SpringBoot中是由ServletWebServerFactoryAutoConfiguration来完成对Servlet容器的配置,下面是它的源码解析:首先来分析ServletWebServerFactoryAutoConfiguration类上注解的作用。@Configuration@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)...

2019-08-18 21:20:46 320

原创 Spring Boot定制错误响应

1. SpringBoot默认的错误处理机制浏览器,返回一个默认的错误页面浏览器发送请求的请求头其他客户端,默认响应一个json数据原理SpringBoot中错误处理的类基本都由ErrorMvcAutoConfiguration来配置1. ErrorPageCustomizerErrorMvcAutoConfiguration中有向IOC容器注入ErrorPa...

2019-08-17 22:10:09 208

原创 状态模式

概述在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状态(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱。维护也会很麻...

2019-08-15 22:50:38 92

原创 访问者模式

定义封装作用与某种数据结构(如List/Set/Map等)中的各元素的操作。它可以使你在不改变各元素的类的前提下,定义作用于这些元素的操作。但需要这些被操纵的元素相对稳定。简而言之,就是专门有个对象来访问某种数据结构的元素,且不改变这些元素。使元素本身与操作分离。访问者模式能把处理方法从数据结构中分离出来,并可以根据需要增加新的处理方法,且不用修改原来的程序代码与数据结构,这提高了程序...

2019-08-15 21:46:54 89

原创 责任链模式

定义使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止。简而言之,就是为请求创建一个接收此次请求对象的链,这些对象可处理请求,也可以传递请求,知道没有对象处理该请求为止。web中的过滤器就采用了这种设计模式来处理request请求。类型行为型适用场景一个请求的处理需要多个对象当中...

2019-08-15 18:41:39 74

原创 中介者模式

定义定义一个 封装一组对象如何交互的 对象。主要解决多个对象和类之间的通信复杂度,主要通过一个中介类接受所有消息,然后再进行转发。通过使封装交互对象的明确的相互引用来促进松散耦合,并允许独立地改变它们的交互。这样可以降低多个对象和类之间的通信复杂度,由原来的网状接口转变为星型结构。类型行为型适用场景系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解...

2019-08-14 23:15:11 92

原创 命令模式

定义将请求封装成对象,这样方便将命令对象进行储存、传递、调用、增加与管理。对于接收者来说,它都可以识别这些请求对象,然后执行不同的行为。命令模式解决了应用程序中对象的职责以及它们之间的通信方式,简而言之,就是命令模式可以使发送者和接收者解耦,发送者和接收者之间没有直接的引用关系,发送命令的对象只知道如何发命令,不知道如何执行。日常生活中,类似命令模式的例子,是开关。将开关和点灯连接起来...

2019-08-14 22:24:19 159

原创 备忘录模式

定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。诸如文本编辑器的撤销,虚拟机的快照,浏览器回退都采用了相同机制。类型行为型适用场景保存及恢复数据相关业务场景 需要回退的时候 发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。优点为用...

2019-08-14 21:26:18 82

原创 观察者模式

定义定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖着(观察者)都会收到通知并更新。生活中这样的机制就由很多,比如微信朋友圈在你点赞后,如果有别人在下面评论,那么你也会收到通知,在点下赞后,你就成为了观察者。上面的定义还是很容易理解的。类型行为型适用场景关联行为场景,建立一套触发机制优点观察者与被观察者之间建立了...

2019-08-13 21:37:43 91

原创 解释器模式

定义给定一个语言(如由abcdef六个字符组成的字符串集合),定义它的文法的一种表示(S::=abA*ef,A::=cd)并定义一个解释器,解释器使用该表示来解释语言中的句子。其中的解释器类似一个翻译机。为了解释一种语言,而为语言创建的解释器。字面上看,应该不难理解,就是解释语句的,比如对字符串 "1 + 2" 进行翻译为数学上的1+2,但是在实现上,会比较复杂。类型行为型...

2019-08-13 16:42:44 202

原创 策略模式

定义定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。可以大范围的处理掉 if—else。通俗的讲,就是将对应不同情况的策略封装起来,应用多态的机制针对不同的情况调用这些策略类。比如生活中淘宝的促销活动,满减,立减,返现都是不同的促销策略,这样就可以把这些不同的促销策略封装起来。策略模式使用的是面向对象的继承和多态机制,从而实现同一行为在...

2019-08-13 15:35:02 155

原创 迭代器模式

定义提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示。合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如链表、散列表等数据结构。链表和散列表等数据结构都是可以存放若干个对象的集合,其区别是按照不同的方式进行存储对象。我们希望无论何种集合,应当允许程序以一种统一的方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表达及存储的...

2019-08-11 16:27:30 236

原创 模板模式

定义定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板方式使得子类在不改变算法结构的情况下,重新定义算法的某些步骤。是基于继承的代码复用的基本技术。简而言之,完成一件事情,有固定的数个步骤,但是会有步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。固定不变的步骤可以抽取到父类中,需要变化的步骤定义为抽...

2019-08-11 15:42:44 483

原创 代理模式

定义为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介的作用。即为指定的目标对象提供一个代理商,由代理商来完成对目标对象的操作。打个比方,帮别人做事情,自己就是别人的代理;让别人帮自己做事情,别人就是自己的代理。代理又分为静态代理,动态代理,CGLib代理。类型结构型适用场景保护目标对象。在某些情况下,一个客户类不想或者不能直接引用一...

2019-08-10 22:21:30 165

空空如也

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

TA关注的人

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