自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ

RabbitMQ1. RabbitMQ引言官方网站:https://www.rabbitmq.com/什么是MQMQ(Message Queue):消息队列。通过典型的生产者和消费者模型,生产者不断的向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接受。没有业务逻辑的侵入,轻松的实现系统间解耦。别名:消息中间件,通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。上图就是消息队列最原始的模型,其中

2021-05-31 12:58:00 179

原创 线程池原理

线程池1、为什么使用线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的任务的程序都可以使用线程池。线程池的使a用能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,会消耗资源,降低系统的稳定性。2、线程池的实现原理当线程池提交一个任务之后,线程池是如何处理这个任务的?从图中可以看出,当提交一个新任务到线程池

2021-05-29 12:35:34 192

原创 Docker

dockerdocker中文网:https://vuepress.mirror.docker-practice.com/1、 什么是docker什么是docker官方介绍:We have a complete container solution for you no matter who you are and where you are on your containerization journey我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以开启你的容器旅程。

2021-05-29 09:08:17 274

原创 Servlet 编程基础

Servlet 编程基础Servlet 是连接 Web 服务器与服务端 Java 程序的协议,是一种通信规范。这个规范是以一套接口的形式体现的。Servlet 规范中包含一套接口。而 Servlet 接口仅仅是其中之一。微观地讲,Servlet 是 Servlet 接口实现类的一个实例对象,是运行在服务器上的一段 Java小程序,即 Server Applet,也就是 Servlet 这个单词的来历。Servlet 的主要功能是根据客户端提交的请求,调用服务器端相关 Java 代码,完成对请求的

2021-05-26 12:30:20 531 1

原创 Redis持久化机制

Redis持久化机制1、什么是持久化利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复持久化的作用:防止数据的意外丢失,确保数据安全性持久化的方式:将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单。将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂。2、RDBRDB就是以快照的形式对Redis中的数据进行持久化。RDB的启动方式:命令: save作用:手动执行一次保存操作其中保存的数据在dump.rdb文件中。我们可以通过Redis

2021-05-25 18:10:04 146 1

原创 基于位图的优先级算法

要求写就绪表,获取最高优先级怎样让任务进入退出就绪.6对应二进制为:000110高3位:000=0通过OSMapTbl映射后:OSMapTbl[prio>>3]=OSMapTbl[0]=00000001低3位:110=6通过OSMapTbl映射后: OSRdyTbl[prio>>3]=OSRdyTbl[0]=010*******10对应二进制为:001010高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTb

2021-05-24 20:08:13 188

原创 垃圾回收机制

垃圾回收机制垃圾回收,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾回收有三个问题:什么是垃圾什么时候回收如何回收垃圾回收机制是Java的招牌。极大地提高了开发效率。如今,垃圾回收几乎成为了现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进,不同大小的设备、不同的特征的应用场景,对垃圾回收提出了新的挑战。1、 垃圾回收概述1、什么是垃圾(Garbage)垃圾是指 在运行程序中没有任何指

2021-05-24 20:07:21 1032 2

原创 嵌入式操作系统

填空Linux命令1. cp 复制文件或目录 cp [options] source dest 参数 -a 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容其 作用等于dpR参数组合。 -d 复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 -f 覆盖已经存在的目标文件而不给出提示。 -I 在覆盖目标文件之前给出提示 -l 不复制文件,只是生成链接文件。 -p 还把修改时间和访问权限也复制到新文件中。 -r 若给出

2021-05-23 14:24:55 227

原创 Synchronized原理

Synchronized原理1、Synchronized使用//synchronized代码块synchronized (SynchronizedTest.class){ System.out.println("进入同步代码块");}//synchronized代码方法public synchronized void testFun(){ System.out.println("进入同步方法");}字节码:public class SynchronizedTest {

2021-05-20 21:28:19 95

原创 Cookie和Session

1、Cookie1.1、Cookie概述我们打开163邮箱官方。https://mail.163.com/输入账号和密码,并且点击十天内免登录。进入邮箱。当我们关闭浏览器或关闭电脑之后,我们再次进入邮箱。https://mail.163.com/此时我们不需要输入用户名和密码。说明:我们的账号和密码是保存在客户端,并且是在客户端的硬盘上,而不是内存中。客户端电脑中用于保存这些会话状态的资源,称为Cookie。Cookie是1993由网景公司(Netscape)前雇员发明的一种进行网络会话状

2021-05-18 19:31:47 142

原创 SpringBoot+Vue+SpringSecurity+JWT实现登录

前后端代码:GitHub地址Vue-Cli创建前端项目前端项目目录结构我们需要Login.vue和Home.vue组件,一个用于登录,一个用于登录成功之后的跳转。我们需要封装一些函数,这些函数用于在前后端交互时请求与响应的拦截。定义api.js我们还需要删除原有的组件,清除App.vue的内容(不能删除)。引入Element-ui参考element-ui官网在main.js文件中引入Element-uiimport ElementUI from 'element-ui';import

2021-05-18 18:13:11 1624 2

原创 运行时数据区

1.什么是运行时数据区Java虚拟机在执行Java程序的过程中,会涉及的数据划分到不同的内存区域去管理,而这部分区域就是运行时数据区。运行时数据区有5个区域。分别是:方法区,虚拟机栈,本地方法栈,堆,程序计数器。其中:这5个区域可以分成两类:线程私有,线程共享线程私有:虚拟机栈,本地方法栈,程序计数器线程共享:方法区,堆线程共享和线程私有的区别是:线程私有是跟随线程的启动而存在,线程共享是跟随虚拟机的启动而存在线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行在H

2021-05-12 19:04:40 306

原创 CAS

CAS问题1、共享资源的访问public interface Account { ///查询钱 Integer getBalance(); //取钱 void withDraw(Integer amount); //设置一个静态方法,设置1000个线程 每个线程取钱 ///在控制台打印余额和耗时 static void demo(Account account){ List<Thread> ts = new Ar

2021-05-08 15:30:52 80 1

原创 Volatile

Volatilevloatile关键字是Java虚拟机提供的最轻量级的同步机制,本文介绍volatile的作用和底层实现原理。1、volatile解决线程安全性问题我们说过,在多线程中存在竟态条件,会出现线程安全性问题volatile关键字作用是保证可见性和有序性,并不会保证原子性。volatile可以解决可见性问题class ThreadDemo1 implements Runnable{ public volatile boolean flag = false; @Ove

2021-05-08 13:39:40 63

原创 树常见算法题1

求中序遍历后继节点class NextNode{ int value; NextNode left; NextNode right; NextNode parent; public NextNode(int value) { this.value = value; }}public class FindNextNode { //中序遍历 将节点加到list中 public static void findAllNextNo

2021-04-23 19:54:40 104

原创 浅拷贝和深拷贝

浅拷贝浅拷贝会创建一个新对象,如果这个对象的属性是基本类型,那么拷贝的就是基本数据类型的值。如果这个对象的属性是引用数据类型,那么拷贝的就是对象的引用地址。//实现Cloneable接口 重写clone()方法class Thcher implements Cloneable{ String name; public Thcher() { } public String getName() { return name; } p

2021-04-20 09:31:04 87

原创 线程安全问题

线程安全问题1. 什么是线程安全要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)的、可变(Mutable)的状态的访问。共享:变量可以由多个线程同时访问。可变:变量的值在其生命周期内可以发生变化。一个对象是否是线程安全的,取决于他是否被多个线程同时访问。这指的是程序中访问对象的方式,而不是对想要实现的功能。要使得对象是线程安全的,需要采用同步机制来协同对对象可变状态的访问。2. 竟态条件当某就算的正确性取决于多个线程的交替执行时序时,那么就会发生竟态条件。最

2021-04-17 20:23:22 78

原创 Java内存模型(JMM)

Java内存模型​ 在并发程序中,涉及到操作系统的底层,因此我们很难去判断程序的执行是怎样的。同时涉及到多个线程对共享资源的访问。一致性和安全性将会受到严重挑战。所以,我们需要保证多个线程正确的协同工作。Java内存模型可以帮助我们解决这些问题。# Java内存区域(结构)和Java内存模型1. java内存区域和Java内存模型是两个不一样的东西。内存区域是指JVM运行时将数据分区域存储,强调与内存空间的划分。2. Java内存模型时定义了线程和主内存之间的抽象关系,用来屏蔽各种硬件和操作系统的

2021-04-17 16:33:23 61

原创 类加载器

类加载器1.类加载器概述​ 类加载就是将磁盘上的class文件加载到内存中。虚拟机设计团队把类加载阶段的"通过一个类的全限定名获取描述此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为"类加载器"。类加载器是JVM执行类加载机制的前提。ClassLoader的作用# ClassLoader的作用ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的。ClassLoader负

2021-04-17 09:35:26 2303 1

原创 生产者消费者问题

生产者消费者问题生产者与消费者问题是多线程同步问题的经典案例。也称有限缓冲问题。# 什么是生产者消费者问题该问题描述了共享固定大小缓冲区的线程,生产者的主要作用是生成一定量的数据放到缓冲区,消费者也在缓冲区消耗这些数据。这类问题的关键在于保证生产者不会在缓冲区满时加入数据,消费者也不会下缓冲区空时消耗数据。# 如何解决这类问题生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据

2021-04-15 09:58:27 105

原创 线程的其他方法

线程的其他方法1. 终止线程一般来说线程的执行完毕就会结束,无需手动关闭。但当我们需要手动杀死一个正在运行的线程。可以通过一些方法。stop方法(废弃)# stop()方法不推荐使用因为stop()方法太暴力,会强制杀死线程。这就类似于: 你正在写文档,突然停电,文档没有保存。在程序运行过程中,强制杀死线程,线程还没有来得及保存上下文就结束了。public class Demo1 { public static void main(String[] args) {

2021-04-11 11:06:58 67

原创 创建线程的方式

创建线程的方式1、Thread类构造方法// Thread类源码private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals)我们解释在初始化方法中的参数:ThreadGroup g 线程组,指定这个线程是在哪个线程组下Runnable target 指

2021-04-11 11:04:58 49

原创 多线程基本概念

多线程中的几个概念1、 线程的进程的区别每个正在运行系统上运行的程序都是一个进程。每个进程中包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行。也可以把它理解为代码运行的上下文。因此线程基本上是轻量级的进程,它负责在单个程序中执行多任务。进程是所有线程的集合,每一个线程是进程中的一条执行路径。2、 并发(Concurrency)和并行(Parallelism)无论是单CPU还是多CPU,操作系统都营造出了同时运行多个程序的假象。实际的过程是CPU的快速切换。

2021-04-11 11:03:53 58

原创 Redis实现Mybatis的二级缓存

## Mybatis中的二级缓存Myabtis 的二级缓存是如何实现的# 在Mybatis中开启二级缓存在Mapper.xml文件中加标签<cache /> 开启二级缓存需要将实体类序列化,否则会出现错误 Cause: java.io.NotSerializableException: com.jiang.travels.entity.User# Mybatis的二级缓存的实现mybatis中有一个接口Cache。mybatis二级缓存的实现类是PerpetualCache

2021-04-09 12:17:28 297 1

原创 类加载机制

虚拟机类加载机制1.概述虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型有虚拟机预先定义,引用数据类型需要进行类的加载。 在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为java应用程序提供高度的灵活性。 Java作为可以动态扩展的

2021-04-01 12:51:46 50

原创 Git常用命令

Git命令# Git 配置git config 查看git配置git config -- global user.name ""git config -- global user.email ""# 查看当前状态git status可以根据文件的颜色来判断当前的状态- 红色 文件在工作区修改,还未添加到暂存区和本地库- 绿色 文件添加到暂存区,但还未添加到本地库# 初始化版本库git init

2021-03-23 20:37:50 47

原创 数据库--存储引擎和锁

1、MySQL存储引擎1.1、MySQL的体系结构# MySQL Server的组成部分1. Connection Pool 连接池组件2. Management Services & Utilities 管理服务和工具组件3. SQL Interface SQL接口组件4. Parser 查询分析器组件5. Optimizer 优

2021-03-14 16:39:02 109 2

原创 数据库--索引

MySQL索引1、什么是索引# 官方定义: 一种帮助mysql提高查询效率的数据结构 index# 索引的数据结构 B+树# 索引的优点 大大加快了数据的查询速度# 索引的缺点 维护索引需要耗费数据库的资源 索引需要占用磁盘空间 当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响,因为会对底层结构重排序2、 索引分类-- 在InnoDB(支持前四种)# 主键索引 设定在主键后数据库会自动建立索引,innoDB为聚簇索引# 单值索引 即一个索引只包含单个列

2021-03-10 19:23:15 53

原创 数据库-- 事务

什么是事务保证业务操作完整性的一种数据库机制事务(ACID)# 事务四大特性(ACID)## 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。 因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。## 一致性(Consistency) 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到 ## 隔离性(lsolation) 隔离性是当多个用户并发访问数据库时,比如操

2021-03-08 11:38:48 134

原创 HashMap源码

HashMap源码1、简介HashMap是基于哈希表的Map接口的实现,是以key-value存储形式存在,即主要用来存放键值对,HashMap的实现不是同步的,这意味着它不是线程安全的,它的key、value都可以为nullHashMap中的映射下不是有序的。java1.8之前的HashMap由数组-链表组成的,数组是HashMap主体,链表则是主要为了解决哈希冲突(两个对象调用 hashcode方法计算的哈希码值一致导致计算的数组索引相同)而存在的。java1.8以后在解决哈希冲突上有了变化

2021-02-23 15:19:43 274

原创 链表经典算法题

链表的常见算法题:解决链表的算法题通常有两种方法: 1、 借助容器(栈、数组、哈希表...) 2、 快慢指针在要求空间复杂度的情况下,我们会使用快慢指针1、 - 输入链表头节点,奇数长度返回中点,偶数长度返回上终点 - 输入链表头节点,奇数长度返回中点,偶数长度返回下终点 - 输入链表头节点,奇数长度返回中点前一个,偶数长度返回上终点 - 输入链表头节点,奇数长度返回中点前一个,偶数长度返回下终点//输入链表头节点,奇数长度返回中点,偶数长度返回上终点public stati

2020-11-02 12:38:00 237

原创 ArrayList容器源码详解

ArrayList1、ArrayList的底层 – 数组数组结构的优缺点:数组查询块,根据地址和索引直接获取元素数组增删改慢,每次都需要创建新数组。且移动元素位置2、ArrayList继承关系public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}2.1、S

2020-09-19 16:20:04 102

原创 树3--二叉排序树

二叉排序树在线性表中,我们可以通过数组和链表对数据进行查询、添加、删除。在数组中查询的时间复杂度为O(1) , 添加删除的操作时间复杂度为O(n)在链表中查询的时间复杂度为O(n) ,添加删除的操作时间复杂度为O(1) 【且当前已找到需要删除的数据】因此我们通过二叉树来存储数据,以及与数据的一些处理。二叉排序树的定义二叉排序树(BST),又称二叉查找树、二叉搜索树。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点比当前节点的值大。特别说明,如果有相同的值,可

2020-09-17 11:07:33 131

原创 单例模式

单例模式单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建。并且它可以提供一个访问该实例的方法。单例模式使用场景:需要频繁的进行创建和销毁对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到对象、工具类对象、频繁访问数据库或文件的对象(比如数据源,session工厂)。单例模式的五种方式:1、饿汉式静态常

2020-09-15 16:21:04 63

原创 树2--线索二叉树和赫夫曼树

文章目录树线索二叉树赫夫曼树树线索二叉树问题引入:在该树中,1,2,3结点的左右指针并没有全部被利用。我们希望充分利用各个结点的左右指针,让各个结点指向自己的前后结点。解决方法:线索二叉树介绍线索二叉树n个结点的二叉链表含有n+1个空指针域。利用二叉链表中的空指针域,存放指向某种遍历次序下的前驱和后继结点的指针。线索二叉树可分成前序线索二叉树,中序线索二叉树,后序线索二叉树。如何实现线索二叉树我们中序遍历树;得到的结果是:3、1、0、4、2、53 的 左右结点都为空,那么我们将

2020-09-10 14:29:34 140

原创 树1--二叉树的实现和遍历

文章目录树基本术语二叉树二叉树的实现二叉树的遍历树树(Tree)形结构是一种重要的非线性结构。树形结构反映了数据元素之间的层次关系和分支关系。基本术语​ 一个结点的子树个数称为该结点的度(degree),一棵树中结点度的最大值称为该树的度。度为0的结点称为叶子结点或者终端结点。​ 树中结点的后继结点称为儿子结点,结点的前趋结点称为儿子的父亲结点。​ 结点的层数使从根开始算起的。设根节点的层数为1,其他结点的层数等于父亲结点的层数加1.​ 若把树中每个结点的各子树看成从左到

2020-09-08 17:18:10 134

原创 栈和递归3--递归

递归算法思想​ 递归(Recurrence)是计算机、数学、运筹等领域经常使用的最强大的解决问题的方法之一。他用一种简单的方式来解决那些用其他方法解起来可能很复杂的问题。​ 递归的基本思想是把一个问题划分为一个或多个规模更小的子问题。,然后用相同的方法解规模更小的子问题。注意,这里的子问题应该与原问题保持相同类型。递归算法的设计:1、找到问题的初始条件(递归入口),即当问题规模n小到某一个值时,该问题变得简单,能够直接求解。2、设计一个策略,将一个问题划分为一个或多个一步步接近递

2020-09-08 13:19:05 220

原创 栈和递归2--栈的应用

文章目录栈的应用括号匹配问题进制转换简单的四则运算栈的应用括号匹配问题问题:给出一个字符串,里面有三类括号:“(,)”、 “[,]”、 ”{,}"括号成队出现并且嵌套正确,返回true ;否则返回false;示例:input:“({()})"output: trueinput:"{(]}"output: false算法:依次扫描字符串。1、如果出现左括号【 ‘(’、‘[’ 、‘{’ 】时。进栈。2、如果出现右括号【 ‘)’、‘]’ 、‘}’ 】时​ 2.1、若栈

2020-09-07 11:32:41 157

原创 栈和递归1--栈的实现

文章目录栈的特点栈的实现栈的特点栈(Stack)又称堆栈,是一种基于后进先出(LOFO)策略的集合类型。是限制在表的一端进行插入删除运算的线性表。栈可以用来在函数调用时存储断点,做递归时要用到栈。通常将能够进行插入和删除运算的这一端称为栈顶,另一端称为栈底。当表中没有元素时称为空栈。栈的常用运算:Pop():弹出操作,每次删除操作。Push():压入操作,将数据插进栈中。isFull():判断当前栈是否是空栈。isEmpty():判断当前栈是否已满。Pick():得到栈顶元素的值,但不能

2020-09-06 14:26:07 416

原创 队列详解2-两个队列实现栈

两个队列实现栈栈和队列相似,都是特殊的线性表。但在数据的运算方法与队列不同,栈为先进后出。队列是先进先出。算法思路:先初始化栈:初始化两个循环队列。先存入数据:按照存入队列的方式将数据存入栈中。现在取出一个数据:我们将Queue1的数据依次存入Queue2中,直到Queue1只剩一个数据,然后将最后一个数据出队列。再加入数据:在已有数据的队列中添加数据。取出数据:同样,将Queue2的数据依次存入Queue1中,直到Queue2还剩最后一个数据,然后将最后一个数据出队列。我们发

2020-09-01 14:43:43 354

空空如也

空空如也

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

TA关注的人

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