- 博客(67)
- 收藏
- 关注
原创 redis集群-主从复制
slave 启动,同步初请slave 启动成功连接到 master 后会发送一个 sync 命令slave 首次全新连接 master ,一次完全同步(全量复制)将被自动执行,slave 自身原有数据会被master 数据覆盖清除;首次连接,全量复制。
2023-11-17 20:17:25
251
原创 ⛳面试题-简述并分析ThreadLocalMap的key为什么是弱引用
注意:因为 ThreadLocal 的使用规范是使用 static final 进行修饰,所以 ThreadLocal 是存放在常量池的,不容易被回收,所以,ThreadLocalMap 在使用 ThreadLocal 对象作为 key 的时候需要使用弱引用,以保证不会出现内存泄漏;然而,需要注意的是,由于弱引用的特性,在某些情况下可能会导致 key 被提前回收,导致数据访问异常,因此在使用 ThreadLocal 时也需要注意合理的生命周期管理,避免出现意外情况;ThreadLocal 源码结构。
2023-11-14 11:37:34
1070
原创 ⛳ MyBatis 中 Mapper 接口工作原理实例解析
上面我们用层层深入的方式摸清楚了 Mapper接口是如何找到实现类的。我们分析了 Mapper接口是如何注册的,Mapper接口是如何产生动态代理对象的,Maper接口方法最终是如何执行的。总结起来主要就是这几个点:Mapper 接口在初始SqlSessionFactory 注册的。Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。
2023-10-14 21:03:56
1672
1
原创 ⛳ MVCC 原理详解
事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。假如 A 转账给 B 100 元,先从 A 的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完 A 的 100 元后,还没来得及给 B 加上,银行系统异常了,最后导致 A 的余额减少了,B 的余额却没有增加。所以就需要事务,将 A 的钱回滚回去,就是这么简单。为什么要有事务呢?就是为了保证数据的最终一致性。MVCC 是 写时复制(copy on writer)思想的一种体现。
2023-09-06 20:26:35
713
原创 ⛳ 面试题-单例模式会存在线程安全问题吗?
单例模式是 Java 中常用的设计模式之一,属于设计模式三大类中的创建型模式。在运行期间,保证某个类仅有一个实例,并提供一个访问它的全局访问点。单例模式所属类的构造方法是私有的,所以单例类是不能被继承的。实现线程安全的单例模式有以下几种方式有:饿汉式、懒汉式、懒汉式改良版(双重同步锁),内部静态类、枚举;相比于饿汉式,懒汉式显得没那么 “饿”,在真正需要的时候在去创建实例。优点:线程安全的,可以延时加载。缺点:调用效率不高(有锁,且需要先创建对象)、使用反射,序列化创建对象依然可以不是单例的。
2023-08-31 13:13:17
1392
原创 ⛳ Docker 安装 MySQL
原因是mysql 8以上默认使用的是caching_sha2_password身份验证机制,之前用的是mysql_native_password。从5.7升级到8.0不会改变现有用户的身份验证方式,但新用户会默认使用新的cacthing_sha2_password。所以对于所有涉及到数据和配置的,都不应该放在容器内部。,哪个容器要用就需要各自安装。 在容器内默认不支持。来挂载外部数据目录。
2023-08-22 19:33:22
1090
原创 ⛳ TCP 协议面试题
关闭连接时,被动断开⽅在收到对⽅的FIN结束请求报⽂时,很可能业务数据没有发送完成,并不能⽴即关闭连接,被动⽅只能先回复⼀个ACK响应报⽂,告诉主动断开⽅: “你发的FIN报⽂我收到了,只有等到我所有的业务报⽂都发送完了,我才能真正的结 束,在结束之前,我会发你FIN+ACK报⽂的,你先等着”。假设⽹络是不可靠的,被动断开⽅发送FIN+ACK报⽂后,其主动⽅的ACK响应报⽂有可能丢失,这时候的被动断开⽅处于LAST-ACK状态的,由于收不到ACK确认被动⽅⼀直不能正常的进⼊CLOSED状态。
2023-08-20 16:26:00
1371
原创 ⛳ Java 网络编程
TCP/IP模型中的各种协议,依其功能不同,被分别归属到这四层之中,常被视为是简化过后的七层OSI模型。域名解析的过程:先找本机hostsC:\Windows\System32\drivers\etc\hosts,是否有输入的域名地址,没有的话,再通过DNS服务器,找主机。TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。
2023-08-20 16:16:03
197
原创 ⛳ TCP 协议详解
TCP / IP 协议包含了一系列的协议,也叫TCP / IP协议族(TCP / IP Protocol Suite , 或 TCP / IP Protocols ),简称 TCP / IP。TCP / IP 协议族提供了点对点的连接机制,并且将传输数据帧的封装、寻址、传输、路由以及接受方式,都予以标准化。
2023-08-20 14:11:18
1620
原创 ⛳ Java - IO
Java的IO库主要分为两大类:字节流和字符流。字节流(Byte Streams):字节流以字节为单位进行数据传输,适用于处理二进制数据和字节流。常用的字节流类有InputStream和OutputStream。其中,InputStream用于从输入源读取字节数据,而OutputStream用于向输出目标写入字节数据。字符流(Character Streams):字符流以字符为单位进行数据传输,适用于处理文本数据和字符操作。常用的字符流类有Reader和Writer。
2023-08-17 17:35:00
312
原创 ⛳ 将本地已有的项目上传到 git 仓库
直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去。然后push到远程仓库上去即可。此方法适用于本地项目不是一个git仓库的情况。 将本地的项目初始化为一个git仓库,然后再强行合并本地仓库和远程仓库,由于这两个仓库是完全不同的两个仓库,所以直接。此方法适用于本地项目已经是一个 git 仓库的情况。复制自己项目的所有文件到刚刚克隆下来的仓库中。都会报错,需要在pull的时候假加上。 二、强行合并两个仓库。 一、克隆 + 拷贝。push到远程仓库上面。
2023-08-17 11:39:48
772
原创 ⛳ Java 反射
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助缺德任何类的内部信息,并直接操作任意对象的内部属性及方法。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。**🎃 使用反射的前提条件: **
2023-08-16 21:27:47
128
原创 ⛳ Docker - Centos 安装配置
查看Docker版本,(检查Docker是否安装成功):(running 说明启动成功,运行状态):安装指定版本的Docker。:安装最新版的Docker。查看安装的Docker版本。:启动Docker服务。
2023-08-15 21:23:27
1288
原创 ⛳ Java集合框架
早在Java 2之前,Java 就提供了特设类。DictionaryVectorStack和Properties这些类用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。集合框架被设计成要满足以下几个目标。该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
2023-08-13 15:08:56
386
原创 # ⛳ Docker 安装、配置和详细使用教程-Win10专业版
编辑窗口内的JSON串,填写下方加速器地址,并应用和重启Docker。注册一个账号,选择“镜像加速器”后,在右侧选择“Windows”,如下图,下载安装Docker稳定版即可。win10系统,打开控制面板-“应用”-“程序和功能”,开启Hyper-V,按照提示重启系统即可。Docker默认安装在C盘中,这样慢慢会导致C盘空间越来越小,建议把Docker安装到D盘。现在去安装Docker就可以了,Docker默认安装路径已经更改成功了。下载完成后,点击运行,同意协议即可,没有其它配置。
2023-08-08 20:20:25
2294
原创 ⛳ Java注解
当一个 Annotation 类型被定义为运行时 Annotation 后, 该注解才是运行时可见, 当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取。@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素。@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被javadoc 工具提取成文档。默认情况下, javadoc是不包括注解的。
2023-08-07 11:33:18
125
原创 ⛳ StringBuffer and StringBuilder 处理字符串
当append()和insert()时,如果原来的value数组长度不够,可扩容。扩容原理:/**} }和中的方法支持方法链操作} // return this 返回对象本身。
2023-08-05 11:42:25
180
原创 ⛳ 多线程面试-什么是多线程上下文切换?
多线程会共同使用一组计算机上的CPU ,而线程数大于给线程分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。不同的线程切换使用 CPU, 发生的切换数据等, 就是上下文切换在上下文切换过程中, CPU 会停止处理当前运行的程序, 并保存当前程序运行的具体位置, 以便之后继续运行. 从这个角度来看, 上下文切换有点像我们同时阅读几本书, 在来回切换书本的同时我们需要记住每本书当前读到的页码. 在程序中, 上下文切换过程中的 “页码” 信息是保存在进程控制块(PCB)中的。
2023-08-05 10:41:09
430
原创 ⛳ String 字符串的存储原理及常用方法
代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。String是一个final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。String对象的字符内容是存储在一个字符数组value[]中的。
2023-08-04 15:17:52
1472
原创 ⛳ Java多线程 一,线程基础
在计算机科学中,程序(Program),进程(Process)和线程(Thread)是三个重要的概念,它们都与执行计算机任务和程序相关。程序(Program):程序是一系列指令的集合,这些指令按照特定的顺序组织,用于完成特定的任务或执行特定的操作。程序是静态的,它们只是存储在计算机磁盘或存储设备中,并不直接执行。当我们想要运行一个程序时,操作系统会将程序加载到内存中,并将其转换为进程,然后才能执行其中的指令。进程(Process):进程是计算机程序在执行时的实例。
2023-08-01 21:25:29
324
原创 ⛳ 面向对象面试题
在JDK1.7及之前,HotSpot虚拟机将Java信息,常量池,静态变量,即使编译后的代码(JIT)等数据,存储在Perm(永久代)里(对于其它虚拟机如BEA JRockit、IBM J9等是不存在永久带概念的),类的元数据和静态变量在类加载的时候被分配到Perm里,当常量池回收或者类被卸载时,垃圾收集器会回收这部分内存,但效果不太理想。 由于是实例的一部分,在类初始化的时候,从运行时常量池取出直接引用或者值,与初始化的对象一起放入堆中。的限制,所以此配置已经失效了,现在可以使用更多的本地内存。
2023-07-26 16:24:34
1493
5
原创 ⛳ 抽象类和接口的区别
所以一开头就说了,继承的方式太死了,是什么就是什么。不得不说这是一种糟糕的方案,因为这种方案违反了面向对象设计中的一个核心原则ISP,在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起,这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变而改变(比如修改alarm方法的参数),反之亦然。由于Java多态的特性,接口的引用是可以接受子类对象的,用实现的子类实例化声明的接口后,就可以通过接口调用子类重写的方法。
2023-07-24 18:44:44
273
原创 ⛳Java中的静态
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PgnYjk8v-1690195345747)(https://gitee.com/galloping_pony/img-home/raw/master/%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F.drawio.png)]使用范围:在Java类中, 可用static修饰属性、 方法、 代码块、 内部类。类方法,类中使用static修饰的方法。
2023-07-24 18:42:58
527
原创 ⛳ Java单例模式
如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Jav单例实现失效。提供静态方法返回对象实例,返回的是静态实例(静态的特征),所以只有一个实例。单例模式:要求程序中某个,再程序运行的整个整个周期中中,只有一个实例。
2023-07-24 18:40:36
77
原创 ⛳ Java中的装箱和拆箱
在Java SE5之前,如果要生成一个数值为10的Integer这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。那什么是拆箱呢?//装箱 int n = i;//拆箱简单一点说,装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。int(4字节)Integerbyte(1字节)Byteshort(2字节)Shortlong(8字节)Longfloat(4字节)Floatdouble(8字节)Double。
2023-07-22 16:27:41
433
原创 ⛳ 如何使用 getResourceAsStream() 加载文件
是java中用于加载资源文件的方法之一。它是和Class类提供的方法,用于从类路径(ClassPath)中获取资源文件并返回一个输入流 (。这个方法常用于加载配置文件,模板文件,图片,音频等各种类型的资源。name: 表示要加载的资源我呢见的路径,可以是相对路径或绝对路径。对于相对路径,其起始点通常是调用方法的类或类加载器的位置,需要看是调用, 还是调用。具体细节看下文。如果找到资源文件,则返回一个对象,允许你以字节流的方式读取资源文件的内容。如果找不到资源文件,则返回 null。
2023-07-21 22:37:54
10729
2
原创 ⛳ Java面向对象
面向过程,强调的是功能行为,以函数为最小单位类(Class)和对象(Object)是面向对象的核心概念。类是对一类事物的描述,是抽象的、概念上的定义对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。可以理解为:类=抽象概念的人;对象=实实在在的某个人面向对象程序设计的重点是类的设计类的设计,其实就是类的成员的设计。
2023-07-20 20:01:40
66
原创 ⛳ JVM内存模型和五大结构详解
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,有着自己完善的硬件架构,如处理器,堆栈等,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
2023-07-20 17:22:28
410
原创 ⛳ Java数组
数组是一种数组结构,用于存储相同类型的多个元素。它提供了一个连续的内存块,用于存储数组元素。数组的特点和数组结构:1. 连续内存:Java数组的元素在内存中是连续存储的。这意味着数组的每个元素在内存中占据相同大小的空间,并且可以通过索引进行快速访问。2. 零基索引:Java数组的索引是从0开始,即第一个元素的索引为0,第二次元素的索引为1,以此类推。通过索引,可以访问数组中的特定元素。
2023-07-19 16:23:02
551
原创 ⛳ Git安装与配置
Git按爪给你和配置,Git的官网,打开 CMD 控制台,查看 Git 版本信息。// 查看命令 git --version。
2023-07-18 13:50:04
739
原创 ⛳ Java开发命名规范(嵩山版)
【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion。反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion。反例:MAX_COUNT / EXPIRED_TIME。
2023-07-17 14:38:39
127
原创 ⛳ java8 :: 用法 (JDK8 双冒号用法)
JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。
2023-06-30 09:44:50
452
原创 ⛳ Class.forName()方法
此外,如果使用默认的类加载器加载类,可以直接使用类名.class获取对应的Class对象,不需要使用Class.forName()方法。在上面的代码中,我们使用了Class.forName()方法来加载"com.example.MyClass"类,并将返回的Class对象赋值给了myClass变量。另外,需要注意的是,Class.forName()方法只能加载已经被类加载器加载过的类,否则会抛出ClassNotFoundException异常。该方法会返回一个Class对象,该对象代表了被加载的类。
2023-06-06 12:15:55
1563
原创 ⛳ getClass().getGenericSuperclass()方法
与getSuperclass()方法的区别:getGenericSuperclass()方法与getSuperclass()方法类似,但是getSuperclass()方法只能获取到当前类的直接超类的Class对象,而无法获取到泛型信息。一般来说,如果你只需要获取一个类的直接父类的 Class 对象,那么可以使用 getSuperclass() 方法,如果你需要获取一个类的直接父类的泛型类型,那么可以使用 getGenericSuperclass() 方法。方法来获取一个对象的直接父类的类型。
2023-06-06 12:15:12
1176
原创 ⛳ protected修饰符
在Java中,protected是一种访问修饰符,用于控制类成员的访问范围。protected修饰符可以被同一个包内的其他类访问,也可以被不同包中的子类访问。
2023-06-06 10:31:47
1174
原创 Java中 final 修饰符
final修饰的变量表示常量,一旦赋值就不能再修改。常量的命名规范是使用全大写字母,多个单词之间用下划线分隔。使用final关键字可以提高程序的可读性和可维护性,同时也可以提高程序的性能,因为编译器可以在编译时进行优化。final修饰的引用类型变量表示该变量引用的对象地址不能再改变,但是对象本身的内容可以改变。final修饰的参数表示该参数是只读的,即在方法内部不能修改该参数的值。final修饰的方法不能被子类重写。final修饰的类不能被继承。
2023-06-05 23:22:37
561
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人