自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 使用redis进行令牌验证

令牌验证在确认订单操作和提交订单操作中,要分别生成一个 token 令牌、 校验 token 令牌,保证幂等性。生成并保存令牌Token = 前缀 + 业务对象ID + UUID// UUID作为令牌String token = UUID.randomUUID().toString().replace("-", "");// 在业务对象中保存 tokenorderConfirmVo.setOrderToken(token);// 使用 redis 保存 token,并设置过期时间:30分钟

2020-07-04 19:32:18 1114

原创 线程池简介与使用

工作流程运行流程:线程池创建,准备好core数量的核心线程,准备接受任务新的任务进来,用core准备好的空闲线程执行。如果core线程满,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行如果阻塞队列满了,就直接开新线程执行,最大只能开到max指定的数量max都执行好了。Max-core数量空闲的线程会在keepAliveTime指定的时间后自动销毁。最终保持到core大如果线程数开到了max的数量,还有新任务进来,就会使用reject指定的拒绝策略进行处理

2020-06-03 19:53:30 164

原创 Morris traversal :不递归、不用栈、O(1)空间遍历二叉树

递归、栈遍历二叉树都是O(n)空间复杂度,莫里斯的方法只需O(1)空间复杂度伪代码:初始化当前节点为rootwhile 当前节点不为空 if 当前节点没有左孩子 输出当前节点的值 前往右孩子 ( 即cur = cur.right ) else (即当前节点有左孩子时) 把当前节点作为 当前节点左子树的最右端节点的 右孩子 (如下图的虚线) 前往当前节点的左孩子 (即 cur = cur.left )JAVA 版本代码public void moris(TreeNode

2020-06-02 21:43:31 216

原创 【JUC】ThreadLocal

作用ThreadLocal类是修饰变量的,重点是在控制变量的作用域在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立,实现每一个线程都有自己的共享变量结构每个Thread线程内部都有一个Map。Map里面存储线程本地对象(key)和线程的变量副本(value)但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本

2020-05-29 17:55:53 262

原创 性能优化小结

性能优化nginx 动静分离emall.conf :数据库多次查询变为一次查出所有数据List<CategoryEntity> selectList = baseMapper.selectList(null);抽取方法,根据条件在 LIST 中过滤数据private List<CategoryEntity> getParent_cid(List<CategoryEntity> selectList, Long parent_cid) {

2020-05-22 20:10:36 229

原创 【JVM】GC日志分析

日志分析打开 GC 日志-verbose : gc-xx:+PrintGC-XX:+PrintGCDetails[PSYoungGen: 5986K->696K(8704K)] 5986K-> 704K (9216K)中括号内: GC 回收前年轻代大小 -> 回收后大小,( 年轻代总大小)括号外: GC 回收前年轻代和老年代大小 -> 回收后大小,( 年轻代和老年代总大小)堆空间分析JDK 7 :触发GCJDK 8 中, 4MB直接进入老年代...

2020-05-19 17:05:19 108

原创 【JVM】G1垃圾回收器

G1 回收器: 区域化、分代式回收器因为G1是一个并行回收器,它把堆内存分割为很多不相关的区域(Region) (物理 上不连续的)。使用不同的Region来表示Eden、幸存者0区,幸存者1区,老年代等。G1 GC有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。由于这种方式的侧重点在于回收垃圾最大量的区间(Region)

2020-05-19 16:40:42 488

原创 【JVM】垃圾回收器

垃圾回收器Serial 回收器 串行回收器是一个单线程工作的收集器,但它的“单线 程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强 调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。Serial收集器是HotSpot中Client模式下的默认新生代垃圾收集器Serial 收集器采用复制算法、串行回收和"Stop- the-World"机制的方式执行内存回收。除了年轻代之外,Serial收集器还提供用于执行老年代垃圾收集的Serial old

2020-05-18 16:59:32 143

原创 【JVM】垃圾回收器概述

垃圾回收器概述分类按照线程数:串行 & 并行 垃圾回收器串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以,串行回收默认被应用在客户端的Client模式下的JVM中在并发能力比较强的CPU上,并行回收器产生的停顿时间要短于串行回收器。和串行回收相反,并行收集可以运用多个CPU同时执行

2020-05-18 14:48:57 128

原创 【JVM】引用类型、内存泄露

引用类型、内存泄露、安全点引用强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。造成内存泄露的主要原因软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。在JDK 1.2版之后提供了S

2020-05-17 14:26:26 221

原创 【JVM】GC

GC标记阶段引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。但是,必须要配合大量额外处理才能保证正确地工作,譬如单纯的引用计数就很难解决对象之间相互循环引用的问题。可达性分析算法通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索。搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到 GC Roots 间没有任

2020-05-17 14:24:00 105

原创 【JVM】String细节

String 细节JDK 8 以前内部定义了 final char[] value储存字符数据JDK 9 使用 byte[]储存不可变性String:代表不可变的字符序列。简称:不可变性。当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值, 不能使用原有的value进行赋值。当调用String的replace ()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value

2020-05-17 10:56:59 116

原创 【JVM】对象实例化

对象实例化对象创建过程判断对象是否被加载, 加载类元信息虚拟机遇到一条new指令, 首先去检查这个指令的参数能否在Metaspace的常量池中定位到一一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在).如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotF oundException异常,如果找到,则进行类加载,并生成对应的Class类

2020-05-16 12:17:13 288

原创 【JVM】方法区

方法区方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,**它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。**虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区分开来。方法区在实际物理内存和堆一样不连续方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机

2020-05-15 12:48:47 180

原创 【JVM】堆与GC

Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是存放对象实例,“几乎”所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的内存区域。堆空间划分新生代对象分配与回收new的对象先放 eden。此区有大小限制。当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到eden然后将伊甸园eden中的剩余对象移动到幸存者0区。如

2020-05-14 19:34:31 264

原创 【JVM】运行时数据区

运行时数据区进程中,线程共享:方法区, 堆; 各自独立: 虚拟机栈, 本地方法栈, PC计数器程序计数寄存器程序计数器(Program Counter Register)是一块较小的内存空间,私有的,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、...

2020-04-26 14:54:16 147

原创 【spring原理】ApplicationContext

ApplicationContext根据github 项目学习:tiny-spring,地址:https://github.com/code4craft/tiny-spring参考博客链接:https://blog.csdn.net/w8253497062015/article/details/90274387区别装载bean的区别:BeanFactory:BeanFactory...

2020-04-26 13:45:12 140

原创 【JVM】运行时数据区

运行时数据区进程中,线程共享:方法区, 堆; 各自独立: 虚拟机栈, 本地方法栈, PC计数器程序计数寄存器程序计数器(Program Counter Register)是一块较小的内存空间,私有的,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、...

2020-04-26 13:18:09 95

原创 【JVM】双亲委派机制

双亲委派机制类加载器种类BootstrapClassLoader(启动类加载器)c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作ExtClassLoader (标准扩展类加载器)加载扩展库,如classpath中的j...

2020-04-22 21:30:52 79

原创 MySQL 技术内幕——InnoDB 存储引擎

MYSQL体系结构MYSQL由一下几部分组成:连接池组件管理服务和工具组件SQL接口组件查询分析器组件优化器组件缓冲组件插件式储存引擎物理文件需要特别注意的是:存储引擎是基于表的,而不是数据库。MYSQL存储引擎InnoDB存储引擎支持事务:主要面向在线事务处理(OLTP)应用。特点是行锁设计支持外键支持类似于Oracle的非锁定读,即默认读取操作不会产生...

2020-04-15 20:55:50 470

原创 【spring原理】bean注入bean

为bean注入bean根据github 项目学习:tiny-spring,地址:https://github.com/code4craft/tiny-spring参考博客链接:https://blog.csdn.net/w8253497062015/article/details/90274387目前的问题:无法处理bean之间的依赖,无法将bean注入到bean中,所以它无法称之为完整...

2020-04-15 14:20:46 414 1

原创 【spring原理】读取xml配置来初始化bean

读取xml配置来初始化bean根据github 项目学习:tiny-spring,地址:https://github.com/code4craft/tiny-spring参考博客链接:https://blog.csdn.net/w8253497062015/article/details/90274387Resource是spring内部定位资源的接口。public interfac...

2020-04-15 14:19:18 266

原创 【spring原理】Bean 注入属性

Bean 注入属性这一步,我们想要为bean注入属性。我们选择将属性注入信息保存成PropertyValue对象,并且保存到BeanDefinition中。这样在初始化bean的时候,我们就可以根据PropertyValue来进行bean属性的注入。Spring本身使用了setter来进行注入,这里为了代码简洁,我们使用Field的形式来注入。PropertyValue 类用于bean的属性注...

2020-04-14 17:57:41 291

原创 【spring原理】抽象beanFactory

抽象 beanFactorystep1中的bean是初始化好之后再set进去的,实际使用中,我们希望容器来管理bean的创建。于是我们将bean的初始化放入BeanFactory中。为了保证扩展性,我们使用Extract Interface的方法,将BeanFactory替换成接口,而使用AbstractBeanFactory和AutowireCapableBeanFactory作为其实现。"A...

2020-04-14 17:57:12 127

原创 【spring原理】基本容器

基本容器根据github 项目学习:tiny-spring,地址:https://github.com/code4craft/tiny-spring参考的博客:https://blog.csdn.net/w8253497062015/article/details/902743871. 定义 Beanpublic class BeanDefinition { private ...

2020-04-14 17:56:06 76

原创 【springMVC】请求参数绑定与常用注解

springMVC(二)请求参数绑定与常用注解请求参数的绑定SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定。<a href="account/findAccount?accountId=10">查询账户</a>请求参数是: accountId=10@RequestMapping("/findAccount")pub...

2020-04-07 21:20:38 208

原创 【springMVC】请求过程与组件

springMVC (一)请求过程与组件请求响应流程用户发送请求至前端控制器DispatcherServlet。DispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器找到具体的处理器(可以根据xml配置. 注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。Dispatc...

2020-04-07 21:20:15 234

原创 【spring】事务控制

spring事务控制事务四大特性ACID原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后...

2020-03-21 17:17:20 87

原创 【spring】基于注解配置AOP

基于注解配置spring AOP在配置文件中导入 context 的名称空间<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/ao...

2020-03-19 20:00:56 78

原创 【spring】 AOP概念与XML配置

spring AOP 与XML配置概念全称是 Aspect Oriented Programming 即:面向切面编程。就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。Joinpoint(连接点 ):指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。Po...

2020-03-19 17:37:49 68

原创 【spring】 基于注解的IOC配置

spring基于注解的IOC配置常用注解创建对象相当于XML的 <bean id="" class="">@Component作用 : 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。属性 :value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。衍生注解@Cont...

2020-03-14 16:39:33 78

原创 【spring】 基于XML的IOC配置

spring 基于XML的IOC配置bean.xml <!-- 配置Service --> <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> <!-- 注入dao --> <property name="a...

2020-03-14 16:38:10 80

原创 【Spring】依赖注入DI

依赖注入概念依赖注入:Dependency Injection。它是spring框架核心ioc的具体实现。程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。简单的...

2020-03-09 13:45:45 66

原创 【Spring】IOC反转控制(bean的概念和使用)

IOC控制反转概念作用:用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统(工厂模式)内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。Spring 基于 XML 的 IOCBea...

2020-03-08 15:14:30 156

原创 Java反射

反射(框架设计)框架:半成品软件。可以在框架的基础上进行软件开发,简化编码反射:将类的各个组成部分封装为其他对象,这就是反射机制好处:1. 可以在程序运行过程中,操作这些对象。2. 可以解耦,提高程序的可扩展性。获取Class对象的方式:Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象多用于配置文件,将类名定义在配置文件中。读取...

2020-03-07 14:14:04 65

原创 【笔记整理】servlet及其生命周期

servlet概念运行在服务器的程序:是接口,定义了被tomcat识别的规则自定义类,实现servlet接口,重写方法原理服务器接收请求后,解析url路径,获取访问的servlet资源路径查找web.xml文件,查找url-pattern标签内容找到对应里的全类名tomcat将字节码文件加载进内存(反射),创建对象调用方法生命周期被创建:init方法,一次一个s...

2020-03-07 12:42:21 141

原创 JAVA字节码(一)

JAVA字节码(一)例1public class Helloworld { public static void main(String[] args) { System.out.println("hello,world"); }}字节码:public class com.xxx.ch1.Helloworld { //构造函数 public com.xxx.ch1.He...

2020-03-03 21:36:55 66

转载 JAVA编程规范

JAVA编程规范阿里巴巴Java开发手册1.4.0命名风格【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID等。正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion反例:macroPolo / UserDo / XMLSer...

2020-03-01 12:53:31 439

空空如也

空空如也

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

TA关注的人

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