- 博客(43)
- 收藏
- 关注
原创 简单了解类加载
如果需要自定义类加载器,那么只需要继承类即可,但继承需要自己重写方法并编写加载逻辑所以如果一般没有太过复杂的需求,可以直接继承类,可以省略自己编写findClass方法以及文件加载转换成字节码流的步骤如果不想打破双亲委派机制,就重写findClass()如果想打破双亲委派机制,还需重写loadClass()@Override// class文件路径// 根据路径读取文件到字节输出流// 加载类。
2024-07-27 08:34:38 263
原创 简单了解IoC
想一想如果只有二级缓存,再加上AOP代理,此时B.a是半成品A,而A是个代理对象,这两个不相同,即b.getA()!= A a而A是个单例对象,这就很奇怪了吧。那你可能又会想那实例化的时候我直接先把代理对象创建出来不久好了吗,不就一样了吗,但是objectFactory每次调用getObject()返回的都是新的代理对象,所以如果某个代理类C被当作很多个类的属性,那么这些类的这个引用属性C还是不相同的,所以我们需要三级缓存,有了二级就不用找三级,即代理对象只会被生产一次。
2024-06-26 08:00:00 1911
原创 简单了解并发容器
写时复制是一种懒加载的设计思想,例如linux创建子进程,并不会拷贝父进程的数据,而是先用一个指针引用指向共享内存,等到父进程需要修改的时候,才会给子进程复制一份冲突的内存。
2024-04-28 14:43:07 425 1
原创 简单了解三级缓存解决循环依赖
其实本质上只有二级缓存,二级缓存提前暴露未完全初始化的单例bean,一级缓存是完整的单例bean,我们用二级缓存给属性赋值,而一级缓存来获取bean,如果有代理bean,那么就会造成beanA和b.属性beanA不同,那第三级缓存实际上是为了代理bean而存在的,我们需要通过第三层缓存SingletonFactory来生成代理对象,注意这里缓存是不能被替换的,只能够新增,所以采用多一级缓存才能对代理bean有效。
2024-04-13 09:00:00 903
原创 简单了解ThreadLocal
除了ThreadLocal还可以用栈的本地变量或者锁来保证线程安全,并且可以用于方法间的数据传递。ThreadLocalMap是ThreadLocal的一个内部类,用于保存数据,key是ThreadLocal的一个(可以有很多个ThreadLocal),那如果是强引用就不会被回收了,value是存放的变量值// 强引用// 弱引用。
2024-04-12 15:40:24 915
原创 简单了解main启动发生了什么
那我们一开始是写了很多的.java文件嘛,java是一个编译 + 解释的语言,前期编译把这些,也就是.class文件。
2024-04-07 10:19:25 701
原创 HTTP不同版本的区别
请求使用代替短链接,不必每次请求都进行三次握手建立TCP连接,减少性能损耗(创建销毁进程)同时加快响应速度(没有慢启动、握手时延)支持,不用等前一个请求收到响应,就可以发送请求,最大请求数据量可以到发送窗口的上限。
2024-04-03 09:19:35 734
原创 简单了解HTTP和HTTPS
以下的指纹、hash值、数字签名都是一个意思。为了保证传输的内容不被篡改,我们需要对内容计算出一个「指纹」,这个哈希值是唯一的,且无法通过哈希值推导出内容。然后同内容一起传输给对方,接收方再次计算数据的hash值,和指纹比对,相同说明数据没有被篡改,但是不能说明内容和hash值没有一起被篡改(也就是消息来源是正确的吗?公钥加密,私钥解密。这个目的是为了保证内容传输的安全,保证只有私钥拥有者才能获取到数据私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,保证消息来源是正确的对指纹用私钥加密。
2024-03-31 09:46:08 966
原创 简单了解策略模式
策略模式提供生成某一种产品的不同方式Strategy策略类定义了某个各种算法的公共方法,不同的算法类通过继承Strategy策略类,实现自己的算法Context的作用是减少客户端和Strategy策略类之间的耦合,客户端只需要调用Context并且传递相应的算法参数,来调用不同的算法,Context的内部实现可以用简单工厂模式。
2024-03-30 16:51:18 696
原创 简单了解观察者模式(发布 - 订阅模式)
观察者根据主题类的内部状态变化来改变自身状态,简单来说就是观察者订阅了主题类,当主题类发布一些消息,观察者就会收到消息,然后做出反应。
2024-03-30 16:16:33 1054
原创 简单了解原型模式
区别于单例模式,原型模式的一个类可以有多个实例化的对象。原型模式通过拷贝来产生新的对象,而不是new,并且可以根据自己的需求修改对象的属性。
2024-03-27 15:49:36 640
原创 简单了解硬中断和软中断
硬中断是硬件发出的请求,会打断CPU正在执行的程序,执行速度很快软中断在硬中断之后,交由内核线程继续完成硬中断的后续任务。
2024-03-27 10:38:03 600
原创 简单了解volatile
简而言之就是本线程对共享变量的修改对其它线程是可见的,强制线程每次读本地变量都需要从主存同步最新值,每次修改完之后都需要同步到主存,相当于通过主存通知其它线程把本地变量置为无效状态。拿上述的单例模式来说,保证了对volatile的singleton的读取在volatile写之后,就可以保证对象是完全创建好的。StoreLoad:在volatile写之后,保证之后的volatile读/写不会重排volatile写之前。volatile是Java的一个关键字,用于修饰变量,保证变量的可见性以及有序性。
2024-03-22 19:50:53 358
原创 LeetCode的LRU缓存实现
LRU是操作系统底层的一个页面置换算法,当空间不够需要换出最长时间没有使用的页面,在本题中的意思就是当到达容量上限的时候要换出最长时间没有被访问过的节点。
2024-03-22 11:25:18 564
原创 简单了解JMM
JMM是Java内存模型,是一种虚拟机规范,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM主要考虑的就是各种变量的访问规则,对于JMM,把各种硬件抽象为本地内存和主存来存放变量。
2024-03-19 08:00:00 1434
原创 简单了解内存管理
操作系统需要管理的就是各个进程的内存,对于进程,需要存储代码、堆、栈等信息,如果让程序员直接来操控物理内存管理进程的话,难度会更大,需要考虑进程在哪个位置分配、会不会冲突等问题,那么操作系统提供了虚拟内存给程序员使用,背后的实现这些脏活累活都交给操作系统去完成了,对于虚拟内存,有一些追求的目标:透明:每个进程看上去都有自己的内存,从0地址开始效率:在虚拟内存转换到物理内存的时候兼顾时间(TLB哈希表)和空间(多级页表懒加载)保护:每个进程是隔离的。
2024-03-18 10:19:13 879
原创 记录JDK17Cglib问题:Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.reflect.Inaccessi
只需要在虚拟机参数 VM Options加入。或者是在测试类的参数加入。
2024-03-17 16:06:56 875
原创 简单了解跨域问题如何解决
跨域就是违反了浏览器规定的一个同源策略,同源策略是为了保证不同页面之间不能用到对方的一下信息(如cookie,DOM对象)保证安全,同源策略主要是三个方面相同,用一个URL来举例的话,,就是协议相同、端口相同、域名相同,后面的路径无所谓。
2024-03-15 17:24:42 531 1
原创 简单了解Semaphore
Semaphore在实现了类似于操作系统进程间通信的信号量,一开始有固定的信号量,acquire就是P操作(减少信号量),release就是V操作(返还信号量),只有获取到信号量(不论多少)才能够执行自己的任务。
2024-03-14 19:17:33 453
原创 简单理解什么是进程
进程可以理解为一个正在,它有一些比较重要的组成部分:内存:进程被创建的时候,指令会被加载在内存中、以及一些初始化的数据也会被加载到内存中寄存器:存放着下一步指令在内存中的位置,以及一些特殊的寄存器比如栈指针、堆指针等等。
2024-03-14 10:06:24 556
原创 简单了解一个数据包在网络的一生
在主题之前,我想先谈谈目前计算机的网络模型,主要谈谈 TCP/IP 模型:应用层:产生最原始的数据,常见协议如 http、ftp、websocket、DNS、QUIC传输层:传递应用层的数据给网络层,必要时进行切割,常见协议如 TCP、UDP网络层:目标寻址,常见协议如 IP、ARP、ICMP网络接入层:通过物理链路传输比特流到目标主机接下来就正式进入主题了。
2024-03-11 10:00:53 756
原创 简单了解TCP/IP四层模型
计算机网络我们可以理解为一个巨大的城市地图,我们想从A地前往B地,其中要走的路、要避开的问题都交给计算机网络解决,直到我们可以正常的到达目的地,那么我们会把其中的过程抽象成一个网络模型,每层负责一个功能。
2024-03-10 10:01:54 655 1
原创 简单了解什么是反射
反射是一种能在运行期分析类以及操作Class对象的机制。在Java项目启动的过程中,程序需要经历两个阶段,首先是编译期(编译器会把.java文件编译成.class文件,然后类加载器会把.class文件加载到内存中)、然后是对于一个类来说,它的元结构信息(构造器、属性、方法等)会被存储在方法区内,同时在堆内存中有一个Class对象与之对应。,同时可以根据需要动态加载一些编译器未知的类(,同时相关的类会被递归加载,我们可以通过反射延迟加载类,加快程序的启动速度)
2024-03-09 08:58:12 571
原创 简单了解什么是CAS
CAS(compare and swap),比较与交换,CAS实际上是操作系统底层提供的一个原子指令,对于CAS来说有三个值,V(需要修改的内存的地址)、A(预期初始的值)、B(预期修改后的值),简单来说就是当V位置的数据为A时,我们尝试把它修改为B。当多个线程同时进行修改的时候,只有一个线程可以成功,其它线程都会失败,对于失败的线程区别于锁不会挂起而是会继续尝试修改。Unsafe类有着类似于C语言指针一样可以操作内存的效果,但是如果不正确的使用Unsafe类可能导致程序出错。
2024-03-08 19:40:59 603 1
原创 简单了解volatile如何解决可见性
volatile是Java的一个关键字,是轻量级的synchronized,用于修饰变量,解决了变量没有可见性和有序性的问题,那什么是变量的可见性和有序性?首先我们先要研究操作系统层面的CPU的缓存一致性问题(对应可见性)和指令优化重排问题(对应有序性),JMM把这些问题封装成了一些关键字(如volatile、synchronized)或者API,我们直接调用就可以解决掉这些问题。
2024-03-07 09:25:55 1315 1
原创 简单了解对象实例化过程
这几步一般来讲是顺序进行的,不过由于硬件层面的一些优化,可能会发生指令重排的情况,导致3、4步调换位置,我们在程序中就会看到NPE空指针异常,通常可以用volatile修饰这个变量来解决,不过我们今天主要谈谈这个实例化过程,也就是给对象分配内存的过程。在Java程序,我们绝大多数的对象都在堆内分配内存,只有少部分的对象经过JIT的逃逸分析之后会在栈上分配内存,那对于大多数对象来说,具体是在堆内的什么位置分配内存呢,我们需要首先来看看堆内更加详细的图。空闲链表:适合有内存碎片的垃圾回收器,如CMS。
2024-03-03 09:00:00 694
原创 简单了解事务和日志和锁的关系
先来说说原子性,我们知道活跃的事务一般有两种结果,失败回滚或者成功提交,对于失败回滚,我们会用到undo log,对于事务内的每次逻辑操作(也就是一条SQL语句),会把未改变前的快照行数据保存到undo log页,这也就形成了undo log版本链(也就是MVCC),我们先不谈这个,当发生错误需要事务回滚的时候,我们根据undo log页保存的旧数据来进行事务的回滚,保证了事物的原子性。事务已提交的版本(creator_trx_id < min_trx_id),可见。(使用redo log):事务提交后,
2024-03-02 17:22:12 639
原创 简单了解静态代理和动态代理的区别
我们不直接访问某个对象,而是通过代理对象去访问某个对象,并且可以对功能进行拓展,有个设计模式就叫做代理模式。
2024-02-26 22:05:28 939 1
原创 简单了解RocketMQ
异步:和同步相对,无需等待某些行为,可以直接继续往下执行削峰限流:降低瞬时流量,避免系统宕机解耦:解除业务上下游的耦合。
2024-02-24 17:15:02 355 1
原创 RocketMQ整合SpringBoot快速使用
Message message = MessageBuilder.withPayload("我是一个延迟消息").build();System.out.println("接收到消息" + new String(messageExt.getBody()));System.out.println("失败" + throwable.getMessage());System.out.println("接收到消息" + message);System.out.println("成功");
2024-02-24 17:00:07 1242 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人