自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程与线程

1.进程的引入由于单道处理程序对 CPU 利用率太低(程序在进行IO操作时,CPU 处于空闲状态)。于是引入了多道处理程序,由于 CPU 要在多个程序间切换执行,于是引入了一个概念:进程。进程记录执行中程序的状态(寄存器数据、进程状态、调度相关信息…)。这样我们对操作系统就有了一个宏观的视图,操作系统只需要把这些进程记录好,按照合理的次序推进(分配资源、进行调度)。所以说进程是操作系统分配资源的最小单位。2.线程的引入虽然我们引入了进程已经可以完成多道处理程序来提高 CPU 利用率。假设一个进程需

2020-11-13 12:56:30 179

原创 设计模式(三)- 行为型设计模式

行为型设计模式(十一种):策略模式、模板方法模式、观察者模式、迭代模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。一、策略模式

2020-08-14 09:56:15 336

原创 设计模式(二)- 结构型设计模式

结构型设计模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。一、适配器模式篇幅较长,里面涉及了 适配器模式的介绍、Spring 中适配器模式的使用。Java设计模式之适配器模式二、装饰器模式...

2020-08-12 22:09:20 230

原创 Java设计模式之代理模式

一、代理模式介绍代理模式是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构型设计模式。使用代理模式有两个目的:保护目标对象增强目标对象代理模式类图:在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而被调用者无感知。代理模式分为静态代理和动态代理。1.静态代理静态代理是对某个被代理类的单一代理,无法完成动态扩展,即在被代理类增加了新的方法,代理类需要同步增加,违背开闭原则。这里举个简单的栗子

2020-08-12 16:20:04 191

原创 Java设计模式之装饰器模式

一、装饰器模式介绍装饰器模式是指在不改变原有对象的基础上,将功能附加到对象上,提供比继承更有弹性的方案(扩展原有对象的功能)。装饰器模式适用于以下场景:扩展一个类的功能或给一个类添加附加职责动态给一个对象添加功能,这些功能可以在动态地撤销装饰器模式类图:这里我们以煎饼果子为例,来实现一个装饰器模式。创建煎饼抽象类Battercake(Component):创建被装饰对象类BaseBattercake(ConcreteComponent):创建装饰者抽象类BattercakeDec

2020-08-12 12:58:58 236

原创 Java设计模式之适配器模式

一、适配器模式的介绍适配器模式是指将一个类的接口转换为用户期望的另一个接口,使原本接口不兼容的类可以一起工作。适配器模式适用于以下几种业务场景:已经存在的类的方法和需求不匹配(方法结果相同或相似)的情况;适配器模式不是软件初始阶段考虑的设计模式,是随着软件发展,由于不同产品、不同厂家造成功能类似而接口不同的问题的解决方案;生活中有类似的场景,比如电源插座转换头、手机充电转换头等等。适配器模式的类图:举个栗子,民用电都是 220V 交流电,而手机锂电池使用的是 5V 直流电。因此我们在给手

2020-08-12 11:37:35 327

原创 设计模式(一)- 创建型设计模式

前言23种设计模式大体可以分为下面三种类型:创建型设计模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;结构型设计模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式;行为型设计模式(十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。这篇先从创建型设计模式开始介绍:一、单例模式单例模式在我之前的博客中已经介绍过了,这里就不在赘述,参考链接:Ja

2020-08-11 16:31:13 198

原创 Java设计模式之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、Spring IOC)

文章目录一、简单工厂模式1.if else/switch case2.反射二、工厂方法模式三、抽象工厂模式四、Spring IOC一、简单工厂模式简单工厂模式是指由一个工厂类对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建的对象较少的场景。简单工厂模式的实现方式:1.if else/switch case其实简单工厂模式的这种写法,就和我们平时代码中的根据不同的参数情况,创建不同的对象几乎相同,看下面代码:创建动物接口:创建不同的动物实现动物接口:创建了一个动物工厂,根

2020-08-11 12:32:35 410

原创 图解 ThreadLocal

ThreadLocal 以空间换时间来实现线程隔离,解决多线程中相同变量的访问冲突问题,保证了别的线程不会访问到线程内的变量。1.每一个线程对应一个ThreadLocalMap在使用 ThreadLocal 时(get/set 方法),会为当前线程 Thread 类中的threadLocals创建ThreadLocalMap对象。之后,如果当前线程使用 ThreadLocal 直接获取 Thread 类的threadLocals对象。源码可见:①ThreadLocal -> get() -&

2020-07-24 11:59:36 383

原创 LeetCode 48. 旋转图像

题目描述:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。要求:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。题目链接如果没有上面的要求,我们完全可以在开一个二维数组,将数字按照规则保存进去,但是题目要求只能使用传入的这个数组,这就使题目难度上升了些许。思路一:双重逆置先将数组以对角线进行逆置(arr[i][j] 与 arr[j][i] 交换),比如上面第一个例子,逆置之后如下:1 4 72 5 83 6 9接下

2020-07-15 10:09:43 103

原创 Docker 常用软件安装

Docker 可以说对于软件开发非常方便了,可以运行不同中间件服务软件,对外暴露使用,而且容器与容器之间互不干扰。下面分别讲述一些常用软件在 Docker 上的安装(后续会继续补充):1.MySQL安装并运行指令(自动拉取镜像):docker run -p 3306:3306 --name mysql \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysql \-v /mydata/mysql/conf

2020-07-05 12:14:21 2744

原创 Netty 工作流程图梳理

Netty 主线程组BossGroup用于客户端的监听,并将监听到的客户端Channel注册到从线程组WorkGroup上的一个NIOEventLoop的Selector上,这个NIOEventLoop主要用于和客户端数据的 Read / Write,客户端和服务端会在数据传输的管道ChannelPipeline中调用InboundHandler/OutboundHandler对数据进行处理。...

2020-05-23 10:47:12 1953

原创 NIO 简单实例

前言在 Java 中,数据传输 IO 模型大概分为三类:BIO(同步阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)。在 BIO 中,服务器会针对每一个连接都去开一个新的线程进行处理,这样实现非常简单快速,但是对于资源消耗巨大,于是提出了 NIO。在看本博客之前建议先了解一下 NIO 的基本用法。一、NIO简介NIO 是一种基于事件驱动的 IO 模型,面向缓冲区编程,NIO有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。通俗理解,NIO 的一个线程管理

2020-05-16 15:35:01 1490

原创 服务器向前端传输静态资源(Java)

在编写项目时可能会遇到一些需求,前端向后台请求静态资源(图片、JS、HTML等),JS和HTML一般是不会改变的,但是对于图片来说就可能需要后台的处理,所以我提出了两种方式来解决。1.使用 Nginx 实现动静分离顾名思义,就是将静态资源存储到 Nginx 服务器上,让 Nginx 去处理一些静态资源的请求,具体配置可以参考:Nginx整合Tomcat实现动静分离2.后台服务器返回需要处理的图片这里就以前端需要登录验证码向后台服务器请求验证码图片的需求为例:该服务调用Google工具包Produc

2020-05-12 22:47:11 702

原创 Mybatis 原理分析(SpringBoot)

前言在学习之前需要复习以下知识:动态代理JDBC操作了解Spring容器的创建流程一、向Spring容器中注入Mapper接口代理对象1.注册MapperScannerConfigurer组件的 BeanDefinition ,并在void registerBeanDefinitions 方法中为MapperScannerConfigurer组件设置@MapperSacn注解中所配置的属性信息;MapperScannerRegistrar.java2.MapperScannerConf

2020-05-09 13:59:39 359

原创 SpringBoot2.X 多项目maven依赖管理

SpringBoot2.X 依赖管理有两种方式:一、spring-boot-starter-parent在开发springboot项目时,如果只是开发简单的springboot项目我们可以采用 pom 单继承spring-boot-starter-parent,如下:spring-boot-starter-parent 是一个特殊的 starter,它继承自spring-boot-depe...

2020-04-28 14:14:28 547

原创 微信小程序获取UnionId - Java后台解决

UnionId 是微信平台用户的唯一标识,对于后台开发来说,UnionId 无疑是一个非常好用的东西。前言在获取 UnionId 之前,首先需要做下面的准备:在小程序平台完善自己的微信小程序信息在微信开放平台将自己的微信小程序进行绑定(在绑定小程序中使用的小程序账号就是上一步注册小程序时所用的账号/邮箱)一、编写微信小程序前端代码从 wx.getUserInfo接口文档...

2020-04-18 17:55:42 1330

原创 Spring注解开发【源码分析】

一、注册组件@ComponentScan扫描指定包下的组件。String[] value():扫描基础包范围Filter[] includeFilters():扫描并获取符合过滤规则的组件Filter[] excludeFilters():扫描并排除符合过滤规则的组件 - 过滤规则由@Filter定义@Filter定义扫描包的组件过滤规则。FilterType type():过...

2020-04-08 12:31:02 488

原创 SpringCloudAlibaba Nacos服务配置持久化、Nacos集群部署配置

版本:NACOS 1.2.01.Nacos服务配置持久化配置在使用Nacos对某个服务进行全局配置时会在Nacos客户端配置列表来为服务添加配置,而这些配置即使你重启Nacos也会一直存在。因为每个Nacos服务器都自带了一个小型的嵌入式数据库derby。虽然这样解决了服务配置持久化的问题,但是每个Nacos都自带一个derby,对于启动多个默认配置下的Nacos节点(Nacos集群),...

2020-03-30 20:50:19 360

原创 IDEA配置热部署Devtools(开发必备技巧)

当你在开发是,仅仅只是修改了一个 Controller 或者修改某个 Javabean 中的内容等等,而要重新启动部署项目,这样不但要耗费时间,也使得开发效率大大降低,尤其是在一些大型开发工程中,这样的启动会更加明显。这里便提出了热部署方式,在修改代码时不需要重新启动就能让后台代码起作用。IDEA配置热部署分为五部:1.添加 Devtools-jar 包到 project使用 maven ...

2020-03-11 22:11:21 4859

原创 Java并发编程实战(进阶篇 - 下)

紧接着上一篇我们继续分析在并发编程中所用到的一些并发工具。5.Fork/Join 框架5.1 什么是 Fork/Join 框架Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork :就是把一个大任务切分成若干子任务并行的执行;Join:就是合并这些子任务的执行结果。设计思路图:...

2020-03-05 00:15:08 312

原创 Java并发编程实战(基础篇)

学习本文内容,默认已经了解Java多线程基础。本篇即为基础篇,那么主要讨论如何编写线程安全的代码,大概分为3个方向如何避免多线程同时访问同一时刻访问相同数据共享发布对象,从而使多线程同时安全访问根据现有线程安全组件构建线程安全的类在学习各模块只是之前,先普及一些知识。1.编写线程安全的代码核心?在访问共享、可变的状态要进行正确的管理。(可能现在还不太明白,看下去慢慢就懂了)2....

2020-03-05 00:14:49 537

原创 Java并发编程实战(进阶篇 - 上)

通过上一篇的学习我们就可以运用这些方法来构建线程安全的类,那么本篇我们会着重学习Java中的同步容器类、并发容器和框架、原子操作类、并发工具类、Executor 框架,看看这些并发类库或者框架是怎样实现的。一、同步容器类Java中同步容器类有2类:Vector、Stack、HashtableCollections 类中提供的静态工厂方法创建的类(由 Collections.synchro...

2020-03-05 00:14:21 270

原创 JUC Executor-ThreadPoolExecutor(线程池) 源码解析

通过Java并发编程实战(进阶篇 - 下)对 Executor 框架的简介,已经基本了解了 Executor 框架的结构和成员,本篇讲解 Executor 框架中任务执行单元 ThreadPoolExecutor(线程池)工作原理。前言提出三个问题来更好的了解 ThreadPoolExecutor:什么是线程池?线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行...

2020-03-04 18:55:18 368 1

原创 JUC Condition 源码分析

前言之前我已经分析了 AQS 的部分源码,那么在学习 Condition 原理之前,建议先去了解一下 AQS 的工作原理,可以参考:JUC AQS源码分析(上) – AQS原理分析JUC AQS源码分析(中) – ReentrantLock上锁源码解析一、Condition 概括Java并发编程实战(进阶篇)中分析 ArrayBlockingQueue 的阻塞入队和出队方法时使用到了 C...

2020-02-23 00:04:08 204

原创 阻塞队列(ArrayBlockingQueue) 迭代器源码分析

在看到 ArrayBlockingQueue 迭代器时感觉比之前看到的迭代器实现都要复杂,所有就专门提出来说一说。ArrayBlockingQueue 迭代器与 ConcurrentHashMap 迭代器类似都是一种“弱一致性”迭代器,在遍历数组时修改数组并不会抛出 ConcurrentModificationException 异常。为什么 ArrayBlockingQueue 迭代器复杂呢...

2020-02-22 00:56:36 843 2

原创 ConcurrentHashMap 源码分析(JDK1.8)

ConcurrentHashMap(JDK1.8)实现线程安全的思想也已经完全变了,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式思想。前言在学习 ConcurrentHashMap 源码之前你需要知道以下知识:HashMap 源码分析(JDK1.8)(由于 Conc...

2020-02-14 22:56:47 324

原创 HashMap 源码分析(JDK1.8)

最近在学习并发容器 ConcurrentHashMap,所以就先从 HashMap 开始了解。前言普及一下后面需要用到的一些知识:HashMap底层是由 数组+链表/红黑树 实现的;这些数组就相当于哈希表;哈希表简单理解:由对象的 hashCode 通过 hash 函数处理得到 hash 值,再处理 hash值 得到数组下标直接存储(时间复杂度为 O(1));HashMap has...

2020-02-10 02:17:40 279

原创 ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理

在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ConcurrentModificationException 异常,但在并发容器中还会出现这种情况吗?在并发容器中并不会出现这种情况,这是因为,util包中的迭代器实现是fast-failed迭代器(就是一旦由修改就抛异常),而在current包中迭代器是弱一致性迭代器。那么我们通过 Concurr...

2020-02-08 19:34:42 2183

原创 JUC AQS源码分析(下) -- ReentrantLock解锁源码解析

上篇讲解了ReentrantLock的加锁过程,本篇我们接着讲解ReentrantLock解锁过程的源码。ReentrantLock解锁解析我们还是先写一个应用,从unlock() 方法一步一步进行底层源码分析。0.先写一个Demo public static void main(String[] args) { final ReentrantLock reentrantLock ...

2020-01-26 13:17:33 498

原创 JUC AQS源码分析(中) -- ReentrantLock上锁源码解析

上篇主要讲解的AQS框架的基本原理以及设计思想,我们知道了AQS自定义同步组件大概需要三种技术:自旋、CAS、LockSupport.park();那么本篇我们着重分析一下并发大佬 Doug Lea 设计的ReentrantLock,它是如何在保证线程同步的情况下进行加锁的。这里贴一张ReentrantLock的类图Sync是ReentrantLock的内部抽象类,继承自AbstractQ...

2020-01-26 13:17:22 430 1

原创 JUC AQS源码分析(上) -- AQS原理分析

该系列博客主要分为上中下三篇分别介绍:AQS框架的原理、ReentrantLock上锁源码解析、ReentrantLock解锁源码解析一、介绍由于synchronize关键字在jdk1.6之前为重量级锁效率很低,每次对线程进行操作都需要涉及操作系统层面,于是并发大佬 Doug Lea 设计了JUC包,将线程同步操作提升到jdk级别,最差也是jvm级别。队列同步器 AbstractQueued...

2020-01-26 13:17:05 528

原创 SpringBoot校园导航图后台代码实现

一、前言数据结构课设写一个校园导航图,正好舍友会安卓,于是我就用SpringBoot和他合作写了一个前后端交互的项目,由于时间之后3天,所以就没有加一些用户模块、权限模块,也就简单实现了景点信息、路径信息的增删改查。二、所需技术SpringBoot搭建项目的整体框架景点数据、路径数据采用MySQL数据库查询数据添加缓存使用Redis数据库DAO层使用MyBatis框架都是一些基本...

2020-01-13 22:20:50 653 2

原创 七大排序详解(选择、插入、冒泡、希尔、归并、快速、堆)- Java实现

本文图片来自https://www.jianshu.com/p/d243e1aa13ce一张图概述各种常用的排序算法:下列代码都是各种排序的核心代码一、冒泡排序1.1 算法思想每轮都会将剩余序列中最大值或者最小值得出,直到剩余一个数字1.2 动画演示1.3 代码实现 /** * 冒泡排序 * 外层控制轮数:n-1轮 * 内层控制比较次数:n-i-1次 */ ...

2019-12-23 20:10:58 255

原创 二叉排序树(Binary Search Tree)- Java实现

图片来自https://blog.csdn.net/isunbin/article/details/81703762一、二叉排序树简介二叉排序树,又叫二叉查找树(BST),它或者是一棵空树;具有以下性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也分别为二叉排序树;二、二叉排序...

2019-12-22 16:23:19 184

原创 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)

转载BinarySearch.java/** * @ClassName BinarySearch * @Description 折半查找 * * 可以使用插值公式将折半查找性能优化 * * 只需将其中的 mid = (low+high) / 2 = low + 1/2*(high-low) * 改为 mid = low + (high-low) * (key-a[low])...

2019-12-22 13:04:52 226

原创 图的最小生成树 - Java实现

图片来自:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175一、前言在了解图的最小生成树之前,先弄清几种图的概念:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。连通网:在连...

2019-12-22 12:34:35 198

原创 微服务?集群?分布式?CAP-BASE定理?RPC?

文章目录一、微服务1.单体应用(ALL IN ONE)2.单体应用的缺点3.催生出微服务架构风格4.微服务应用(大型分布式应用)二、集群三、分布式1.分布式与微服务的关系2.分布式与集群的关系3.大型分布式应用(微服务应用)构建四、分布式系统CAP问题1.什么是CAP2.C和A之间的抉择2.1 CP架构2.2 AP架构2.3 CA架构3.与NoSQL的关系4.与BASH的关系五、RPC1.REST...

2019-12-09 19:46:43 344

原创 图的深度优先搜索和广度优先搜索(邻接表) - Java实现

文章目录前言1.什么是图?2.图如何表示?3.如何创建一个邻接表一、深度优先搜索(Depth First Search,DFS)二、广度优先搜索前言1.什么是图?图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常称为顶点(vertex),而点到点之间的连线通常称之为边或者弧(edge)。通常记为G=(V,E)。大概张这样:2.图如何表示?图...

2019-11-15 22:40:32 1768

原创 哈夫曼编码解压缩文件 - Java实现

文章目录前言一、文件压缩二、文件解压结语前言使用哈夫曼编码压缩文件,其实就是将每个字符的哈夫曼编码得到,每8位转为一个字节存到文件中,解压缩的时候,在将字节转为二进制重新找到哈夫曼编码对应的字符,这样即可完成文件的解压缩。文件解压缩的方法:①将每个字符对应的权值存入压缩文件,在解压时重写构建哈夫曼树,遍历哈夫曼树来获得对应的字符②将每个字符对应的哈夫曼编码以及长度存入压缩文件,在解压时根...

2019-11-10 20:37:17 669

空空如也

空空如也

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

TA关注的人

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