- 博客(43)
- 收藏
- 关注
原创 swagger2 和 swagger3 的注解的区别
swagger2swagger3注解位置@Api@Tag(name)Controller类上@ApiOperation@Operation(summary)Controller方法上@ApiImplicitParams@ParametersController方法上@ApiImplicitParam@Parameter(description)Controller方法上@ApiParam@Parameter(description)Contr
2024-08-12 21:36:41
445
原创 XShell连接虚拟机只能输入Public Key解决方案
找到#PasswordAuthentication yes 使用i命令进行编辑 去除前面的#,点击esc,然后输入:wq保存,最后一定要执行systemctl sshd restart重启ssh服务。使用vagrant创建centos stream 9系统替代了原有的安装方式,在使用XShell连接虚拟机的时候,显示只能使用Public Key连接。修改/etc/ssh/文件配置,输入命令cd /etc/ssh/之后使用管理员命令 sudo vim sshd_config。
2024-08-05 11:08:49
1008
原创 三种阻塞唤醒机制
三种阻塞唤醒机制wait notify必须在synchronized里面必须持有锁先等待后唤醒await SignalLcok lock = new ReentrantLock();Condition condition = lock.newCondition();必须在lock.lock(),lock.unlock()里面才能使用必须持有锁先等待后唤醒LockSupport无锁块要求不需要先等待后唤醒成双成对要牢记许可机制,颁发许可之后就能使用许可证不会积累
2024-08-04 14:09:50
334
原创 锁,中断机制
synchronized对于普通同步方法锁的是当前实例对象,通常指this对于静态同步方法,锁的是当前类的Class对象,如Phone.class对于同步代码块,锁的是synchronized()括号里的对象可重入锁非公平锁公平锁非公平锁Lock lock = new ReentrantLock(true); //公平Lock lock = new ReentrantLock(false); //非公平Lock lock = new ReentrantLock(); //非公平恢
2024-08-04 13:27:02
233
原创 悲观锁和乐观锁
悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改synchronizedLock性能低适合写狼性锁乐观锁认为自己在使用数据时不会有别的线程修改数据或资源,所以不会添加锁在java中是通过无锁编程来实现的,只是在更新数据的时候去判段,之前有没有别的线程更新了这个数据如果这个数据没有被更新,当前线程将自己修改的数据成功写入如果这个数据已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如放弃修改,重试抢锁等适合读
2024-08-03 20:53:39
306
原创 JUC---
函数式接口Runnable run 无参数 无返回值Function apply 1个参数 有返回值Consume accept 1个参数 无返回值Supplier get 没有参数 有返回值BiConsumer accept 2个参数 无返回值get和join的区别get在编译时会报出检测异常,join不会
2024-08-03 19:10:25
156
原创 JVM垃圾回收-总结
java中有哪几块内存需要进行垃圾回收?程序计数器、java虚拟机栈、本地方法栈是线程不共享,不需要垃圾回收方法区由jsp回收,程序员不需要管堆是由垃圾回收器负责回收有哪几种常见的引用类型?强引用:最常见的引用方式,由可达性分析算法来判断软引用:对象在没有强引用情况下,内存不足时会回收弱引用:对象在没有强引用情况下会直接回收虚引用:通过虚引用知道对象被回收了终结器引用:对象回收时可以自救,不建议使用由哪几种常见的垃圾回收算法?标记-清除算法:标记之后再清除,容易产生内存碎片
2024-08-03 15:49:14
337
原创 JVM 方法区
方法区(Method Area)方法区是存放基础信息的位置,线程共享,主要包含三部分内容类的元信息运行时常量池字符串常量池方法区除了存储类的元信息之外,还存放了运行时常量池。常量池中存放的是字节码中的常量池内容字节码文件中通过编号查表的方式找到常量,这种常量池称为静态常量池。当常量池加载到内存中之后,可以通过内存地址快速的定位到常量池中的内容,这种常量池称为运行时常量池JDK7以及之前的版本将方法区存放在堆区域中的永久代空间,堆的大小由虚拟机参数来控制JDK8以及之后的版本将方法区存放在元
2024-08-03 09:53:07
383
原创 死锁的概念
死锁的概念在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是死锁发生死锁后若无外力干涉,这些进程都将无法向前推进死锁、饥饿、死循环的区别死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程饥饿死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为
2024-08-02 22:21:07
329
原创 JVM 栈堆
Java虚拟机栈-栈内存溢出Java虚拟机栈如果栈帧过多,占用内存超过栈内存可以分配的最大大小就会出现内存溢出Java虚拟机栈内存溢出时会出现StackOverFlowError的错误本地方法栈Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧在Hotspot虚拟机中,Java虚拟机和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内存上生成一个栈帧,临时保存方法的参数同时方便出现异常时把本地方法的栈信息打印出来堆一般Java程序中堆内
2024-08-02 19:32:32
451
原创 JVM运行时数据区一
运行时数据区-总览线程不共享(安全,线程结束回收)程序计数器Java虚拟机栈(在实现上和本地方法栈是使用的一个栈)本地方法栈线程共享(不安全)方法区堆程序计数器程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的字节码指令的地址在加载阶段,虚拟机将字节码文件中的指令读取到内存之后,会将原文件中的偏移量转换成内存地址。每一条字节码指令都会拥有一个内存地址在代码执行过程中,程序计数器会记录下一行字节码指令的地址。当
2024-08-02 18:27:10
521
原创 JDK8之后的类加载器+总结
类加载器负责在类加载过程中的字节码获取并加载到内存这一部分。通过加载字节码数据放入内存转换为byte[],接下来调用虚拟机底层方法将byte[]转换成方法区和堆中的数据每一个java实现的类加载器中保存了ClassLoader类型的成员变量parent,叫做父类加载器。自底向上查找是否加载过,再自顶向下进行加载。避免了核心类被应用程序重写并覆盖的问题,提升了安全性。
2024-08-02 16:11:25
422
原创 双亲委派机制一
使用AppClassLoader加载java.lang.String,但是输入String的类加载器为null(BootstrapClassLoader),证明了向上查找是否加载过,加载过直接返回。
2024-08-02 14:12:57
607
原创 JVM笔记一
JVM的功能解释和运行对字节码文件中的指令,实时的解释成机器码,让计算机执行。内存管理自动为对象、方法等分配内存自动的垃圾回收机制,回收不再使用的对象即时编译对热点代码进行优化,提高执行效率。将热点代码解释并优化之后放入内存中,下一次使用直接在内存中读取。常见的虚拟机HotSpot(Oracle JDK)HotSpot(Open JDK)GraalVMDragonWell JDKEclipse OpenJ9JVM的组成类加载器运行时数据区域(JVM管理的内
2024-08-02 12:25:48
953
原创 MySQL 索引设计原则
5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增。3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。1). 针对于数据量较大,且查询比较频繁的表建立索引。避免回表,提高查询效率。
2024-05-03 19:19:21
250
1
原创 MySQL 存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也被称为表类型。
2024-05-03 14:11:36
525
1
原创 基于Springboot拦截器对请求参数统一解密
基于Springboot拦截器对请求参数统一解密。因为每一个API接口的请求数据是不一样,如果直接在控制器进行解密那么就会产生大量的冗余代码,这是我们不希望看到的,最好的办法就是使用Springboot的拦截器在请求到达控制器之前将加密的数据进行解密,再继续发送给控制器,之后控制器就能愉快的处理解密完成的数据了。:此处做了一个判断,如果是上传文件就不需要对参数进行解密,直接把原本的request继续往下传递就可以,不然上传文件的流会被损害,导致无法上传文件。将解密后的参数覆盖之前的流。
2024-05-01 13:12:46
3571
1
原创 Java 中的运算符
运算符含义例子结果正号+11负号-1-1加1+12减1-10乘1*22除4/22取模3%21++自增++12自减–10字符串拼接hellohi。
2024-04-27 14:34:38
281
2
原创 一篇文章让你彻底学会Java多线程
先了解几个基本的概念进程:进程是操作系统进行资源分配和调度的一个独立单位,每个进程都有自己独立的地址空间,即它们拥有各自独立的内存空间。进程间通信比较复杂,如通过管道、信号、套接字等方式。如果一个进程崩溃,通常情况下不会影响到其他进程,因为它们彼此隔离。(当程序开始执行时,操作系统会为其创建一个进程)线程:线程是进程中的一个执行流,它是CPU调度和分派的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存和文件句柄。线程有自己的程序计数器、栈和局部变量,但是它们可以访问相同的全局变量。
2024-04-21 17:51:55
1172
1
原创 Java 数据类型和基本数据类型和 String 之前的转换
Java 程序在进行赋值或者运算时,精度小的数据类型自动转换为精度大的数据类型自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成 精度降低或溢出。
2024-04-20 19:12:20
497
1
原创 Java 概述
JDK = JRE + Java 的开发工具 (java, javac,javadoc,javap 等)JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。JDK 的全称(Java Development Kit Java 开发工具包)安装了 JDK,就不用在单独 安装 JRE 了。
2024-04-19 20:23:02
274
1
原创 Java 运算符
运算符含义例子结果正号+11负号-1-1加1+12减1-10乘1*22除4/22取模3%21++自增++12自减–10字符串拼接hellohi。
2024-04-19 20:17:35
324
1
原创 二进制转换十进制
二进制数10101转换为十进制数就是:1*2^4+0*2^3+1*2^2+0*2^1+1*2^0=21。根据观察可以知道十进制数是等于第一行和第二行单元格对应相乘然后相加得到。
2023-03-31 14:05:18
469
原创 thinkphp6操作数据库——判断数据表、字段是否存在,添加、修改、删除字段
之前使用thinkphp6写了一个网站,但是没有写后台在线更新的功能,每次更新都需要下载新的文件覆盖,数据表还得自己手动创建,给没有相关知识的人去使用就会比较难,所以我决定开发一个在线更新的功能。
2023-02-03 18:14:27
3018
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人