自定义博客皮肤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)
  • 收藏
  • 关注

原创 并发的三大特性与单例模式

目录三大特性volatile指令重排及原理DCL(Double Check Lock)happens-before原则单例模式饿汉式单例模式枚举单例模式懒汉式单例模式DCL懒汉式单例模式静态内部类三大特性可见性、有序性、原子性volatilevolatile是Java虚拟机提供的轻量级的同步机制,能保证可见性和有序性(禁止指令重排),但不能保证原子性写屏障:保证在该屏障之前的所有对共享变量的改动,都同步到主内存中;保证指令重排序时,不会将该屏障之前的代码排在该屏障之后读屏障:保证在该

2021-03-20 17:39:39 204

原创 synchronized原理及锁升级

写在前面:大部分图片截自黑马某教程,如有侵权,请务必告知目录对象头Monitor监视器(重量级锁)轻量级锁锁膨胀自旋优化(只针对多核CPU)偏向锁wait与notify原理park()与unpark()原理(底层是Unsafe类的方法)死锁与活锁对象头(以32位虚拟机为例)普通对象数组对象对象头包含以下信息:运行时元数据markword、类型指针、如果是数组对象还会包含数组长度markword结构(这里是64位虚拟机)markword中主要包含以下信息:锁的状态标志(如偏向锁、无锁

2021-03-20 17:10:07 241

原创 1.7与1.8中的ConcurrentHashMap

jdk1.8概述concurrent类型的容器,内部很多操作使用cas优化,一般可以提供较高吞吐量但他具有弱一致性:遍历时弱一致性。例如,当利用迭代器便利是时,如果容器发生修改,迭代器仍然可以继续进行遍历,但这时内容是旧的求大小弱一致性,size操作未必是100%准确读取弱一致性遍历时如果发生了修改,对于非安全容器来讲,使用fail-fast机制也就是让遍历立刻失效,抛出ConcurrentModificationException,不再继续遍历重要属性和内部类// 默认为 0

2021-03-20 14:41:12 238

原创 部署SSM+SpringBoot+SpringCloud至阿里云服务器

目录环境安装jdk安装简单项目部署准备项目打包项目发布项目开放防火墙端口添加安全组启动项目Tomcat安装MySQL安装rpm安装授权远程访问修改字符集Redis安装项目部署环境安装安装软件一般有三种方式:rpm安装包、解压缩、yum在线安装jdk安装jdk我们采用rpm安装包的安装方式jdk1.8 rpm下载地址(提取码3210)下载到windows上之后使用Xftp进行传输,放到/home/huangyue文件夹下,即自己的用户目录(或者自己可以随便放)linux下进入自己的用户目录c

2021-03-14 15:51:54 979

原创 Linux常用命令

目录走进Linux系统目录结构常用命令目录管理cdlspwdmkdirrm、rmdircpmv文件属性chownchgrpchmod文件查看cat、tacnlmore、lesshead、tail其他命令ifconfighostnametopjobs硬链接与软链接Vim 编辑器三种模式命令模式输入模式底线命令模式:wq:set nu账号管理添加账号锁定账号删除账号走进Linux关机指令为:shutdownsync # 将数据由内存同步到硬盘中shutdown # 关机指令shutdown -h

2021-03-14 13:28:36 927

原创 阿里云ECS高效计划免费领取并配置教程

1、先进入阿里云高校学生计划,登录阿里云2、按照如官网所示的流程来3、学生认证成功后,体验阿里云,完成测试,就可以免费领取两个月的ECS云服务器了,默认直接下一步即可(不过需要每天早上8点来领,要不然就抢不到)4、进入管理控制台5、进入管理界面6、进行密码设置按照提示来输入密码即可然后会重启服务器7、复制公网ip8、打开XShell,新建连接,名称随便,主机粘贴刚刚复制的公网ip然后点击确定即可连接上远程Linux服务器这时候就可以随心所欲地使用,安装各种环境,快去试

2021-03-12 09:42:39 563

原创 关于数据库中保留字段的一些坑

在做毕业设计的时候,有一张表使用了 exit 为字段名的字段,当时没有考虑那么多,因为使用 name 作为字段名时是不存在冲突的,当我运行程序后,后台便报错了,信息如下:### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server vers.

2021-02-20 02:18:37 453

原创 什么是Restful风格

1 Restful风格1.1 什么是 RestfulRestful 就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制功能资源:互联网所有的事物都可以被抽象为资源资源操作:使用 POST(添加)、DELETE(删除)、PUT(修改)、GET(查询),使用不同方法对资源进行操作对比之前的传递参数方式:http://localhost:8080/hello?name=Tom&age=20使用Re

2021-02-14 18:36:26 1886

原创 SpringMVC的请求与参数问题(普通请求和Ajax请求)

目录1 发送普通请求,后端返回普通页面1.1 传统方式 @RequestMapping1.2 配置 mvc:view-controller2 发送普通请求,后端返回数据或对象(如 json)3 发送带参的普通请求,后端返回普通页面4 发送带参的普通请求,后端返回数据或对象(如 json)5 Ajax请求5.1 Json5.1.1 Json 对象5.1.2 Json 字符串5.1.3 对象与字符串转换5.2 发送 Ajax 请求,后端返回数据或对象(如 json)5.3 发送带参 Ajax 请求,后端返回数据

2021-02-14 18:19:20 284 1

原创 Java各大垃圾回收器详细介绍

目录概述评估 GC 的性能指标吞吐量与暂停时间吞吐量暂停时间两者对比垃圾回收器的种类垃圾回收器的组合关系Serial 回收器:串行回收ParNew回收器:并行回收Parallel Scavenge回收器:高吞吐量概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的 JVM 来实现由于 JDK 的版本处于高速迭代的过程,因此 Java 发展至今已经衍生了众多的 GC 版本从不同角度分析垃圾收集器,可以将 GC 分为不同的类型评估 GC 的性能指标吞吐量:运行用户代码的时间占

2021-02-08 01:59:57 652

原创 JVM - 垃圾回收相关算法

目录总览垃圾标记阶段:对象存活判断引用计数算法可达性分析算法(根搜索算法、追踪性垃圾收集)对象的 finalization 机制MAT 与 JProfiler 查看 GC Roots垃圾清除阶段标记-清除算法复制算法标记-压缩算法(标记-整理算法)3 种清除算法小结分代收集算法增量收集算法分区算法(不同于分代)总览垃圾收集分为标记阶段和清除阶段标记阶段:引用计数算法、可达性分析算法清除阶段:标记清除算法、复制算法、标记压缩算法、分代收集算法、增量收集算法、分区算法垃圾标记阶段:对象存活判断

2021-02-03 23:37:15 120

原创 JVM - 垃圾收集概述

目录引入什么是垃圾为什么要 GC早期垃圾回收GC 的作用区域相关概念System.gc()内存泄露与内存溢出Stop The World垃圾回收的并发与并行引入什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出垃圾收集,不是 Java 语言的伴生产物,早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp

2021-02-03 21:15:37 151

原创 SpringBoot整合Mybatis

1、导入依赖<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>

2021-02-03 20:58:23 84

原创 Redis Linux版下载安装与部署

环境:CentOS 6、redis-4.0.81、下载 Redis 的 Linux 压缩包,这里以 Redis 4 为例http://download.redis.io/releases/redis-4.0.8.tar.gz2、将压缩包上传至 Linux 的 /usr/local/redis,此redis文件夹是新建的3、对redis-4.0.8.tar.gz 解压,命令是tar -xvf redis-4.0.8.tar.gz,解压完成后可以看到两个目录4、进入 redis-4.0.8 目录

2021-02-03 20:53:15 268

原创 SpringBoot整合Redis

1、因为要整合,所以在本机 windows 上要访问 redis 服务,所以 redis 不能部署在 127.0.0.1上,这样的话只能 Linux 本机上能访问到,因此要让虚拟机联网,绑定其他ip地址。联网后查看当前 ip 地址:ifconfig注意:如果 inet addr 中没有值,则代表此虚拟机并没有联网,可以使用桥接模式进行联网①关闭虚拟机,打开虚拟机设置,网络适配器设置为桥接模式②打开 VMWare 菜单栏的编辑菜单,找到虚拟网络编辑器③选中当前能上网的网卡④配置完成后再打开

2021-02-03 20:48:38 93

原创 SpringBoot整合thymeleaf

目录1 视图模板技术2 使用3 Thymeleaf 相关语法修改标签文本值修改指定属性值在表达式中访问属性域解析 URL 地址包含其他模板文件1 视图模板技术我们熟悉的 JSP 其实只是视图模板技术的一种,除了 JSP 外还有很多其他技术也可以帮助我们实现服务器端渲染。日路:Freemarker、Thymeleaf、Velocity等等。其中最优秀的是 Thymeleaf,而 JSP 因为不容易从 jar 包中读取而不被 SpringBoot 所推荐为什么要使用 Thymeleaf 替代 jsp?

2021-02-03 20:41:27 123

原创 VO转PO时字段不一致转换失败(项目遇到的问题)

错误信息:java.lang.NullPointerException: null at org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.encode(BCryptPasswordEncoder.java:80) ~[spring-security-crypto-5.1.5.RELEASE.jar:5.1.5.RELEASE]根据错误提示:at com.hy.crowd.handler.MemberHandler.

2021-02-03 15:00:11 703 1

原创 字符串常量池 String Pool 详解

目录概述String 的内存分配字符串拼接intern()概述String在jdk1.8及以前底层是采用final char型数组来存储字符串数据的,在jdk1.9时改为byte[]数组,不再是char[]数组(StringBuffer、StringBuilder同是如此)String是不可变的字符序列,简称不可变性通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中字符串常量池中是不会存储相同内容的字符串的,为什么呢?String Pool是一个固定大小的H

2021-01-19 13:34:52 1073

原创 JVM - 方法区

目录1 概述2 HotSpot中方法区的演进3 设置方法区大小4 解决元空间的OOM5 内部结构6 运行时常量池1 概述《Java虚拟机规范》中说明:尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或进行压缩。但对于HotSpot JVM而言,方法区还有一个别名叫做Non-Heap非堆,目的就是要和堆分开。所以,方法区看做是一块独立于Java堆的内存空间方法区与堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际物理内存空间中和Java堆

2021-01-18 20:52:29 145

原创 JVM - 堆内存

目录1 概述2 内存细分3 设置堆空间大小4 新生代与老年代5 对象分配过程6 MinorGC、MajorGC、FullGC7 TLAB8 堆空间中常用参数9 逃逸分析10 总结1 概述一个java程序启动,那么就会启动一个进程,一个进程对应一个JVM实例,一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域Java堆区在JVM启动的时候即被创建,其空间大小也就确定了(但可以调节),是JVM管理的最大一块内存空间《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上

2021-01-17 16:37:40 238

原创 JVM - 执行引擎

目录1 概述2 执行引擎的工作流程3 解释器与 JIT 编译器4 Java代码的执行分类5 为什么还要存在解释器6 编译器7 总结8 写在最后1 概述我们先看两张图,第一张是基本结构,第二张是流程及作用翻译如下:Interpreter:解释器JIT Compiler:即时编译器Intermediate code generator:中间代码生成器Code optimization:代码优化Target code generator:目标代码生成器执行引擎是Java虚

2021-01-17 15:18:14 82

原创 如何使用Spring整合Mybatis?

因为有了 Spring,我们可以管理 Mybatis 中的对象,比如数据源、SqlSessionFactory1、在 Spring 配置文件中配置数据源,首先引入外部数据源文件,源 properties 文件应放在 resources 文件夹下<!--引入数据源文件--><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigure.

2021-01-17 00:00:20 140

原创 Spring5 详解

目录1 概述2 IOC2.1 IOC 实现原理2.2 bean 注入2.3 bean 的类型2.4 bean 的作用域2.5 bean 的生命周期2.6 自动装配2.7 引入外部属性文件2.8 注解开发2.8.1 **创建对象的注解**2.8.2 注解方式进行属性注入2.8.3 完全注解开发(一般在SpringBoot中使用)3 AOP3.1 AOP底层原理3.2 jdk动态代理3.3 相关术语3.4 AOP 的使用3.4.1 xml方式3.4.2 注解方式4 JDBCTemplate5 事物1 概述

2021-01-16 23:52:56 296

原创 JVM - 虚拟机栈

1 概述虚拟机栈保存着一个个的栈帧,一个栈帧代表一个java方法注意:栈无GC垃圾回收,但有OOM内存溢出问题2 栈的特点栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器3 栈的作用主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回4 栈中可能出现的异常①如果使用固定大小的Java虚拟机栈,如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,则会报StackOverflowError异常②如果使用的是可动态扩展的Java虚拟机栈,并

2021-01-16 20:43:14 156

原创 Mybatis详解

简介1.1 什么是MybatisMybatis 是一款优秀的持久层框架它支持定制化 SQL、存储过程以及高级映射Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集Mybatis 可以使用简单的XML或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录MyBatis 本是 Apache 的一个开源项目 iBatis,2010 年这个项目由 apache so

2021-01-15 17:34:07 165

原创 Java线程状态到底是5种还是6种?看这篇文章就够!

前言:网络上的文章杂乱无章,有的说线程是5种也有的说是6种状态,这里我们给出答案:6种6种线程状态java.lang.Thread类中明确声明了线程的6种状态,查看Thread的State枚举类,分别是NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATEDpublic enum State { /** * Thread state for a thread which has not yet started

2021-01-02 12:58:10 1046 1

原创 JVM - 类加载器子系统

写在前面:此笔记是依照尚硅谷课程做的,图片均是截图,如有侵权,请告知类加载器子系统1、类加载器子系统简图  类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识  ClassLoader只负责class文件的加载,至于他是否可以运行,则由Execution Engine执行引擎决定  加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分

2020-12-25 20:04:36 87

原创 JVM - PC寄存器及本地方法接口

写在前面:此笔记是依照尚硅谷课程做的,图片均是截图,如有侵权,请告知PC寄存器及本地方法接口1、运行时数据区:  一个JVM对应一个进程,一个进程可以有多个线程,这些线程共享方法区和堆,每个线程独有一份PC寄存器、虚拟机栈、本地方法栈2、PC寄存器(程序计数器)  PC寄存器存储指令相关的信息,CPU只有把数据装载到寄存器才能够运行  作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码,由执行引擎读取下一条指令。  它是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的

2020-12-25 19:48:46 126

原创 JVM - JVM概述

写在前面:此笔记是依照尚硅谷课程做的,图片均是截图,如有侵权,请告知JVM概述1、Java在C++语言的基础上增加了垃圾收集机制,它为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构,工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力2、JVM只识别字节码class文件,它并不关心,class文件是由何种语言生成的。也就是说JVM有语言无关性,不会单纯地与Java语言“终生绑定”,只要其他编程语言的编译结果满足并包含

2020-12-25 19:35:09 119

原创 网络通信——Java篇

一、网络编程三要素IP地址:唯一识别计算机、设备端口:唯一识别计算机中的应用程序,取值范围是0~65535,且普通应用程序需使用1024以上的端口号,因为0~1023用于一些知名的网络服务和系统应用协议:位于同一个网络中计算机在进行连接和通信时需要遵守一定的规则,这些规则被称为网络通信协议,他对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议二、TCP与UDP协议UDP协议:用户数据报协议  &

2020-11-25 23:02:08 235

原创 String类不可变性详解

String的不可变String(字符串)是一个特殊的对象,一旦初始化就不可以被改变。这里所说的不可变指的是什么,我们先看一个简单的程序:public static void main(String[] args) { String s = "Hello"; s = "World"; System.out.println(s);}输出结果:World不可变是值"Hello"不可以被改变吗?按这个思路输出的应该还是Hello,但实际输出结果是World,为什么?这里所说的不可变指的是创

2020-08-19 00:05:39 1593 1

原创 HashMap 底层源码详解(jdk1.8)

HashMap概述HashMap是一个存放键值对的集合,每一个键值对称为Entry;HashMap的底层实现依旧是一个数组,每一个存放Entry的位置称为一个bucket(桶);每个bucket都有一个索引,可以进行索引访问快速找到bucket里的Entry元素;一个bucket只能存放一个Entry,但其可以指向另一个Entry从而形成一个链表;当链表元素个数超过8个时,java会将其转化为红黑树存储,加快索引速度;当红黑树元素个数小于6个时,java也会将其转回为链表存储,节省空间;

2020-08-15 09:28:30 247

原创 ArrayList 底层源码详解

      我们先复习一下ArrayList:它封装了一系列操作,如增删改查,对比使用传统的数组方便了很多,因为java代码已经替我们写好了,我们直接用即可。      但是,面对即将走向工作岗位的你们,单单知道如何使用远远不够,首先面试官就是一个槛,大部分面试都会问集合的实现原理,这也是大部分面试者的薄弱点。      我们

2020-08-01 18:55:54 689 2

原创 为什么数组下标是从0开始的,而不是1?

首先我们要知道,数组是如何在内存中存储的。我们先创建一个整型数组:int[] array = new int[5];数组中每一个元素都有他的地址值,并且是连续的,假设第一个元素的地址为10000,且他存放的是int类型数据,我们知道他在java中是占用4个字节的,所以他的下一个元素的地址为10004,再下一个就是10008,以此类推。下图显示了数组在内存中的地址分配:那我们直接根据索引寻找元素是如何实现的呢?这涉及到寻址算法公式:array[i] = base_address + i * d

2020-08-01 11:53:58 1048

原创 一篇文章了解ThreadLocal

我们首先要知道ThreadLocal的应用场景: 当我们想让某个变量想在一个线程中随用随取,而与其他线程无关,也称为局部变量,那么我们就需要使用ThreadLocal来给我们提供一个线程内的局部变量。...

2020-07-31 14:58:32 126

原创 Integer的两种创建方式比较

当我们使用Integer定义变量时,可以使用两种方式进行定义①Integer i = new Integer(10);②Integer i = 10;那么这两种方式又有什么区别呢,一个是new出来的,一个是直接赋值出来的。要想知道原理,必须了解new关键字的作用:在堆内存开辟新空间,将对应空间的地址赋给变量,该变量存储在栈内存中。如果是直接赋值方式,则不存在堆内存的说法,直接在栈内存中创建变量。下图是堆栈内存图...

2020-07-12 16:26:59 1333 2

原创 SpringMVC中后端接收前端数据中文乱码解决方案(Eclipse)

1、设置eclipse中全局编码为UTF-8Window→Preferences→General→WorkSpace→Text file encoding2、设置JSP页面为UTF-8编码<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>右键→Preferences→Encoding3、Tomcat服务器server.xml中设置UTF-8编码<Connec

2020-07-11 16:50:05 1371

原创 SpringMvc中/和/*的区别

SpringMvc中’\‘和’\*‘的区别当我们配置springMvc时,在url-pattern中有时会配置’\‘有时又是’\**’<servlet> <servlet-name>springDispatcherServlet</servlet-name>//任意名字 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

2020-07-11 16:25:43 2389

空空如也

空空如也

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

TA关注的人

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