自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 死磕单例模式的DCL

public class Singleton { private volatile static Singleton instance = null; public static Singleton getInstance() { if(null == instance) { synchronized (Singleton.class) { if(null == instance) { .

2021-10-13 23:24:06 111

原创 Web项目中的路径问题

一、绝对路径和相对路径绝对路径:绝对路径就是形如http://ip:port/web项目名/资源名的写法相对路径:任何不以http://ip:port/开头的写法 都称之为相对路径,包括以下几种:/开头的写法,形如/demo.jsp或/img/a.jpg./开头(等于啥也不写),形如image/a.jpg(这种写法等价于./image/a.jpg) 在当前目录下开始寻找…/开头,形如…/image/a.jpg 在当前路径的上一层路径下开始寻找而用户要访问服务器

2020-10-26 11:14:42 584

原创 关于SpringBoot的自动配置原理

一. 加载自动配置类@SpringBootApplicationpublic class SpringBoot01ConfigAutoconfigApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot01ConfigAutoconfigApplication.class, args); }}在springboot给我们生成的启动类中我们可以看到这样

2020-10-22 19:00:32 165

原创 关于动态代理的两种方式

JDK代理Proxy.newProxyInstance():jdk自带的代理方法)也叫jdk代理,java底层封装了实现细节,格式固定,代码简单。直接调用java.lang.reflect.Proxy的静态方法newProxyInstance即可1,被代理的对象必须是一个类,且必须有父接口;2,被代理的类需要增强的方法必须在父接口中出现;三个参数:1,ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的2,Class<?>[] interf

2020-10-21 20:10:24 255

原创 Mysql与Oracle数据库分页方法

MYSQL数据库分页使用的是limit函数语法:select * from test limit m,n※ 其中m是指记录开始的index,从0开始表示第一条记录,n是指从第m+1条开始,取n条。m代表起始偏移量,n偏移总数。SELECT * FROM test LIMIT 5,10;– 检索记录行6-15 10条记录`SELECT * FROM test LIMIT 5;-`检索前5个记录行,表示返回最大的记录行数目Oracle数据库分页方法一:select * fro

2020-10-21 16:51:20 237

原创 spring bean的生命周期

bean的生命周期1、实例化一个Bean--也就是我们常说的new;这一步里面涉及到了获取bean的配置信息,初始化,创建实例等操作2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;需要把这个id值和创建的bean组成键值对放入到容器中(就是一个map)3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值4、如果这个Bean已经实现了BeanFactor

2020-10-21 16:38:36 70

原创 spring bean的scope属性

<bean id="bean的唯一名称" class="method-name" scope="prototype"></bean> #新版中scope属性值有singleton、prototype、session和request<bean id="bean的唯一名称" class="method-name" singleton="false"></bean>#旧版中控制bean的实例创建的是singleton属性,有true和false两个属性值

2020-10-21 16:25:41 195

原创 MYSQL索引优化

mysql执行单列索引和复合索引索引一经创建不能修改,如果要修改索引,只能删除重建。3. mysql的索引是B+树结构,数据都放在叶子结点,是稠密索引它只会在叶子节点上面挂载数据,非叶子节点不会存放数据,数据只会存在叶子节点上面,非叶子节点只存放索引列的数据以一个层高为3的树为例,叶子节点存放数据之后大小1KB,那么这个树可以存放 1170 *1170 *16 =21,902,400,大约2200万条数据。所以在这种千万级的表中通过主键索引查找一条数据,最多3次IO就可以找到一条数据。而很多时候.

2020-10-21 00:38:51 67

转载 log4j的八种日志级别

log4j定义了8个级别的log(除去OFF和ALL 可以说分为6个级别),优先级从高到低依次为:OFF FATAL ERROR WARN INFO DEBUG TRACE ALLALL 最低等级的 用于打开所有日志记录TRACE 很低的日志级别 一般不会使用DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的 主要用于开发过程中打印一些运行信息INFO 消息在粗粒度级别上突出强调应用程序的运行过程 打印一些你感兴趣的或者重要的信息 这个可以用于生产环境中输出程序运

2020-10-20 23:31:57 308

原创 七层模型和tcp/ip四层模型

OSI七层模型应用层网络服务与最终用户的一个接口。协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP主要是提供网络任意端上应用程序之间的接口,如远程访问和管理、电子邮件、虚拟中端以及目录服务等其它功能表示层数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)格式有,JPEG、ASCll、EBCDIC、加密格式等它的主要作用之一是为异种机通信提供一种公共语言,以便能zhi进行互操作会话层建立、管理、终止会话。(在五层模型里面

2020-10-20 23:24:42 93

原创 Get和Post两种请求方式的区别

GET在浏览器回退时是无害的,而POST会再次提交请求。GET产生的URL地址可以被Bookmark,而POST不可以。GET请求会被浏览器主动cache,而POST不会,除非手动设置GET请求只能进行url编码,而POST支持多种编码方式GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。GET请求在URL中传送的参数是有长度限制的(一般在2K-8K左右,浏览器规定的),而POST么有。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET比POS.

2020-10-20 23:06:44 77

原创 Spring的七种传播行为

1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。2、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作3、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘4、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加

2020-10-19 21:18:51 259

原创 四种线程池的特点和创建线程的四种方式

四种线程池的特点1.newCachedThreadPool创建一个可缓存线程池程newCachedThreadPool,是一种线程数量不定的线程池(没有核心线程),并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任

2020-10-19 20:19:41 635

原创 HashMap的基本属性和CurrentHashMap的锁机制

HashMap的基本属性public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { //实现了Cloneable接口和序列化接口,但是没有实现Itearater接口,意味着hashmap不能使用迭代器遍历 //重写序列化id private static final long serialVers

2020-10-19 20:07:16 1655

原创 mybatis执行一条sql语句的过程(底层源码解析)

测试代码块: @Test public void testCreateTable(){ try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder= new SqlSessionFactoryBuilder(); SqlS

2020-10-19 17:20:56 243

原创 mybatis连接oracle时使用自增长id

一,创建表并赋予权限先登陆system用户创建用户,并赋予权限sqlplus system/system --登陆系统用户create user [username] identified by [password];grant select any table to userName; --授予查询任何表grant create any table to username; --赋予创建表grant delete any table to username;

2020-10-19 16:12:20 87

转载 cookie和session的详解和区别

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份(在服务器端也有Cookie实例),Session通过在服务器端记录信息确定用户身份。1.1 Cookie机制在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买

2020-10-18 22:02:51 226 1

原创 连接Docker启动的mysql出现plugin caching_sha2_password could not be loaded的解决办法

问题产生的原因无法加载插件缓存sha2密码,在MySQL 8.0中,caching_sha2_password是默认的身份验证插件,而不是mysql_native_password解决办法一,启动mysql容器命令为:docker run -p 3307:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d mysql-p:暴露端口,把linux的3306端口和docker的3306端口映射起来–name:给启动的容器起名-e 配置容器的

2020-10-18 13:32:22 1165

原创 自写tomcat

最近学完了socket编程,自写了tomcat,求各位大佬指导在这之前还写过一个类似的项目,但不是基于面向对象思想来写的,所以这次用面向对象思想重写一下有较为详细的注释,有需要的自取技术:socket编程 IO流 线程池项目目录:主程序类:package com.briup.application;import com.briup.utils.ThreadPool;import java.io.IOException;import java.net.ServerSocket;i

2020-09-07 21:55:15 78

原创 关于socket编程流的关闭

由Socket和SocketServer创建出来的输入输出流如果关闭的话,那么socket和SocketServer也会关闭但是有showdownInput()和showdownOutput()方法来改变流的流向注意,关闭之后,就不能再使用该流,只能使用另外一种流,也就是如果关闭了输入流,就只能使用输出流,反之亦然可能有小伙伴会疑惑,如果想使用一个Socket和ServerSocket进行交替输入输出操作怎么办?socket编程是基于http的编程,一次请求就是一个socket,下一次请求就再创

2020-09-07 19:43:49 713 1

原创 简单工厂模式

基本介绍:简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一类产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为当用到大量的创建某种,某类或者某批对象时,就会使用到工厂模式当创建一个对象很麻烦的时候,就可以使用简单工厂模式进行封装写了一个生孩子的例子目标类:public class Man extends People { public Man(char gende

2020-09-06 23:08:57 36

原创 原型模式

问题在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源解决办法用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。要实现的效果克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。原型模式的结构与实现原型模式包含以下主要角色。抽象原型类:规定了具体原型对象必须实现的接口。具体原型类:实现抽象原型类的 clone

2020-09-06 21:51:06 57

原创 单例模式

单例模式的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误单例模式有 3 个特点:单例类只有一个实例对象;(必须有静态私有实例,因为构造方法是私有的,所以该类在其它类种不能有实例,也就是说在其他类中不能用实例调用方法的方式获得实例对象,只可以以类名调用静态方法(而静态方法只能调用静态实例)或者得到静态实例

2020-09-06 20:23:36 34

原创 垃圾回收器

评估垃圾回收器的性能指标吞吐量:运行用户代码的时间占总运行时间(程序运行时间+内存回收的时间)的比例暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间内存占用:java堆区所占的内存大小注重吞吐量:注重低延迟:暂停时间:让用户线程停止,让GC执行的状态7种垃圾回收器的概述7款经典垃圾回收器与垃圾分代之间的关系(分代收集算法)因为以上关系,所以需要不同的垃圾回收器组合使用jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(

2020-09-06 17:00:40 179

原创 串行,并行,并发垃圾收集器的区别

串行收集器在单核cpu的硬件情况下(一般不会使用)该收集器会在工作时冻结所有应用程序线程,这使它在所有目的和用途上都无法在服务器环境中使用。并行收集器在停止用户线程之后,多条GC线程并行进行垃圾回收这里画3条线程只是一个概念,具体几条线程还是看情况并发收集器GC线程和用户线程同时运行...

2020-09-06 16:05:33 678

原创 垃圾回收算法

标记阶段1.引用计数算法对每一个对象保存一个整数的引用计数器属性,用于记录对象被引用的情况优点:实现简单,垃圾对象便于标识,判定效率高,回收没有延迟性缺点:无法处理循环引用,致命缺陷2. 可达性分析算法(根搜索算法,追踪性垃圾回收)java(hotspot)选择的算法 有向图表示可达或不可达基本思路:2.1. 可达性分析算法是以根对象集合为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达2.2. 使用可达性分析算法后,内存中的存活对象都会被根节点集合直接或间接

2020-09-06 15:53:14 107

原创 StringTable(字符串常量池)

StringTableString的基本特性字面量的定义方式 :String s1=“hello” 字面量定义的方式,字面量放在常量池中new对象的定义方式:String s2=“hello”final修饰 实现序列化接口 实现compareable接口底层使用字符数组(char[])存储信息 jdk1.9是使用字节数组(byte[])why?一个char占两个字节 大部分String保存的字母,一个字节就可以存的下所以使用buty[] 来存储 可以设定字符编码测试:

2020-09-06 15:04:25 327

原创 方法区

方法区:栈堆方法区的交互关系new一个对象的内存分区方法区的理解线程共享的逻辑上是堆的一部分 实际上是独立于堆的内存空间方法区的东西只加载一次使用永久代使用的是java虚拟机的内存,容易出现OOM元空间使用本地内存实现设置方法区大小与OOM方法区的内部结构存储类型信息,常量,静态常量,即使编译器编译后的代码缓存类型信息:域信息:方法的信息:static变量static hello{}order order =null

2020-09-06 11:45:57 118

原创 红黑树的一些理解

由于个人能力有限,实在不能完整描述出红黑树的各种操作及原理只能说一说理解的思路首先红黑树是排序树,不完美平衡树(黑色结点完美平衡,红色结点不完美平衡)所以表现为整棵树是不完美平衡的红黑树是 2-3-4 树的一种特殊实现(极为重要)红黑树是二叉树,所有的结点都是2-结点,所以为了能够表示3-结点和4-结点,为结点引入了颜色属性:黑色,表示普通结点红色,表示可与父结点合并看作多值结点如上图所示,如果把红黑树的红色结点和其父结点放平,它的结构就和左边的 2-3-4 树一样。另外,红黑树中的旋转和

2020-09-06 11:02:33 52

原创 堆的核心概述

堆堆的核心概述多个线程共享堆空间95%的垃圾回收集中在堆中,5%在方法区中局部变量表(栈帧中)保存了引用,真实的对象存放在堆中,类信息和具体的方法实现保存在方法区中堆内存的细分(GC垃圾回收选择)堆空间的细分 永久区或者元空间具体是由方法区来落地实现的也就是说在设置堆区的大小就是新生区+老年区 不包括元空间新生区:伊甸园区 幸存者1区 幸存者2区 1区和2区只能选择一个使用设置堆内存大小与OOM开发中建议把初始内存和最大内存保持一致避免堆空间的频

2020-09-05 17:16:18 115

原创 虚拟机栈

虚拟机栈概述:类加载子系统只负责class文件的加载,至于它是否可以运行,则由解释器决定。加载的class文件放在方法区中优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多指令tip:栈是运行时的单位,堆是存储的单位即:栈解决程序的运行问题,即程序如何运行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放在哪概述:java虚拟机栈,早期也称java栈,每个线程创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应一次次的java方法调用,是线程私有的

2020-09-05 17:04:52 138

原创 JVM类加载、连接和初始化过程

JVM类加载、连接和初始化过程加载使用类加载系统把.class文件加载到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。在这个阶段,会执行类中声明的静态代码块。也就是类中的静态块执行时不需要等到类的初始化。类加载的最终产品是位于堆区中的class对象,Class对象封装了类在方法区内的数据结构,并向Java程序员提供了访问方法区内的数据机构的接口.我们可以通过类名.class来获取一个类的类型的引用,通过new

2020-09-05 16:54:35 178

原创 运行时数据区概述

红色区域:多线程共享 垃圾回收基本都在堆空间(95%)完成,方法区(5%)一小部分灰色区域:单独线程私有一个jvm就是一个runtime实例,runtime对象相当于一个进程进程是计算机分配内存的最小单位jvm的线程线程时一个程序里的运行单元,jvm允许一个应用有多个线程并行的执行数据区寄存器每个线程都有自己的寄存器,生命周期跟随线程寄存器用来存储下一条指令的地址,也就是即将要执行的代码。由执行引擎读取下一条指令pc寄存器的两个常见问题1.使用pc.

2020-09-05 16:51:54 207

原创 类加载子系统

类加载子系统:加载–>链接过程(验证—>准备—>解析)–>初始化类加载器的分类:引导类加载器(使用非java语言编写)(不继承ClassLoader类),自定义加载器(继承Classloader类)就像多级目录的关系(系统类加载器–>拓展类加载器–>引导类加载器)用户自定义类(或者引入的jar包,如jdbc)默认使用系统类加载器进行加载java的核心类库都是引导类(启动类)加载器加载的双亲委派机制:把请求交由给父类请求,是一种任务委派模式工作原理:

2020-09-05 16:40:51 172

原创 初识jvm

jvm中文为java虚拟机,java语言流行很大一部分是因为jvm的功劳。jvm有以下这些好处:1. 一次编译,到处执行java为各种操作系统都定制了jvm,作为.class文件与操作系统的沟通站,所以不管在哪里写的java代码,只要符合java代码规范,就可以运行在任何一台装有jvm的虚拟机上,不需要任何修改2. 自动管理内存,自动垃圾回收功能自动管理内存使得java程序员只需要关注代码本身,不需要关注代码运行时的各种空间开销。由于实现了自动管理内存,那么就需要垃圾自动回收功能,如果没有这个功能

2020-09-05 16:30:50 59

空空如也

空空如也

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

TA关注的人

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