自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Huangy远

自助者天助之

  • 博客(80)
  • 问答 (2)
  • 收藏
  • 关注

原创 类加载器并行加载类 实战及代码解析

类加载器是如何加载一个类的?类加载器如何实现并行加载类?带着这2个问题,我们看下面的内容。类加载过程实战首先,准备一段测试代码,代码中使用应用程序类加载器去尝试加载一个类public class ClassLoaderDemo { public static void main(String[] args) throws Exception { System...

2020-04-11 10:43:21 833

原创 synchronized—深入总结

synchronized传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,在linux上使用mutex互斥锁,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。对于加了synchronized关键字但运行时并没有多线程竞争,或两个线程接近于交替执行的情况,使用传统锁机制无疑效率是会比较低的。在JDK 1.6之前,synchronized只有传统的锁机制,因此给开发者...

2019-12-29 17:25:00 425

原创 JVM知识点整理

JVMJava虚拟机在执行java程序的过程中,会把它的内存划分为若干个不同的运行时数据区域,如图所示:程序计数器PC程序计数器是一块较小的内存空间,字节码解释器工作时,就是通过改变这个计数器的值来选取下一条要执行的字节码指令。如果线程执行的是java方法,计数器存储的正在执行的虚拟机字节码地址如果线程执行的是native方法,那么这个计数器值为空(Undefined)为了线程切换...

2019-12-26 14:40:05 336

原创 ThreadLocal全解析——你想要的这里都有

ThreadLocal概念ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以通过ThreadLocal对象查询到绑定在这个线程上的一个值。原理关于ThreadLocal的原理,理清四个角色关系:Thread,ThreadLocal,ThreadLocalMap,Entry在ThreadLocal中有个变量指向ThreadLocalMapThreadLocal.ThreadLocalMap thre

2020-06-22 23:03:03 380

原创 BIO、NIO、AIO原理及总结

BIO、NIO、AIO同步阻塞IO(BIO)原理同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。// 客户端import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamRe...

2020-04-01 22:13:32 354

转载 聊聊KMP算法

KMP算法PS:本文转载,觉得写得实在太通熟易懂了,收藏于博客中原文:https://www.zhihu.com/question/21923021背景这几天自学了KMP算法,也在网上看了很多相关的博文,然而他们对next数组的求解方法的解释都比较模糊,难于让读者理解,故参考几位前辈的博文,加以优化,撰此博文,分享一下自己的理解。简述BF算法讲述KMP算法的原理之前,BF算法是绕不...

2020-03-11 22:00:26 798

原创 池化技术

池化技术概念池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。在开发过程中我们会用到很多的连接池,像是数据库连接池、HTTP 连接池、Redis 连接池等等。而连接池的管理是连接池设计的核心,我就以数据库连接池为例,来说明一下连接池管理的关键点。数据库连接池数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从...

2020-02-25 00:01:05 1078

原创 内存泄漏及解决方案

内存泄漏定义某些对象或者数据没有利用价值了,但是由于某些原因占用着内存,无法被回收,就造成了内存泄漏。例子:比如说有一个数组对象,占用内存很大,在使用完毕以后,还有强应用引用着该数组对象,那么这块内存就无法回收。内存泄漏种类Java使用的内存种类包含三种,这三种类型的内存都可能发生内存泄漏。堆内存泄漏:如果在JVM中没有足够的内存空间分配给java对象,将会抛出OOM错误。...

2020-02-23 19:06:14 418

原创 MySQL——锁(全面总结)

锁锁机制用于管理对共享资源的并发访问。lock和latch在数据库中,lock和Latch都称为锁,但是两者意义不同。latch称为闩锁(shuang suo),其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又分为mutex互斥锁 和 rwLock读写锁。其目的是为了保证并发线程操作临界资源的正确性。通常没有死锁的检测机制。lo...

2020-02-17 22:15:13 277

原创 聊聊一致性hash算法

一致性hash算法在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务...

2020-02-14 10:31:56 2847

原创 MQ架构总结

MQ架构概念RocketMQ是一个分布式消息中间件,底层基于队列模型来实现消息收发功能。RocketMQ集群中包含4个模块:Nameserver, Broker, Producer, Consumer。Nameserver:存储集群中所有Brokers信息、Topic跟Broker的对应关系。Broker: MQ最核心模块,主要负责消息存储、消费者的消费进度管理。Producer:消...

2020-01-20 15:23:55 1020

原创 RocketMQ分析——高并发读写

RocketMQ高并发读写Rocket的高并发读写的原因可以从3个方面进行分析:生产者负载均衡生产者发送消息有负载均衡。生产者发送消息时,会自动轮询当前所有可发送的broker,一条消息发送成功,下次换另外一个broker发送,以达到消息平均落到所有的broker上。消费者负载均衡同一个group的所有消费者平均消费该Topic的所有队列。Broker服务端的高并发读写主要利用Lin...

2020-01-20 15:18:31 566

原创 Dubbo优雅停机

Dubbo优雅停机背景对于任何一个线上应用,如何在服务更新部署过程中保证客户端无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求。理想条件下,在没有请求的时候再进行更新是最安全可靠的,然而互联网应用必须要保证可用性,因此在技术层面上优化应用更新流程来保证服务在更新时无损是必要的。传统的解决方式是通过将应用更新流程划分为手工摘流量、停应用、更新重启三个步...

2020-01-17 11:03:29 1909

原创 GC垃圾回收

GC垃圾回收JVM的垃圾回收机制,在内存充足的情况下,除非你显式调用System.gc(),否则它不会进行垃圾回收;在内存不足的情况下,垃圾回收将自动运行判断对象是否要回收的方法引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1。当计数器为0的时候,对象就可以被回收。缺点:存在循环引用的情况,导致2个循环引用对象的内存得不到释放。目前没...

2020-01-17 10:52:11 511

原创 git原理及指令

git原理及指令基本用法上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。git add files 把当前文件放入暂存区域。files传递’.'则是全部文件git commit 给暂存区域生成快照并提交。git reset -- files 用来撤销最后一次git add *files*,你也可以用git reset 撤销所有暂存区域文件。git checkou...

2020-01-16 16:35:30 220

原创 Protocol Buffer

Protocol Buffer概述什么是 Google Protocol Buffer?Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protocol Buffers 是一...

2020-01-16 14:17:07 181

原创 序列化框架的选型和比对

序列化框架的选型和比对序列化通信大白话介绍下 RPC 中序列化的概念,可以简单理解为对象 –> 字节的过程,同理,反序列化则是相反的过程。为什么需要序列化? 因为网络传输只认字节。所以互信的过程依赖于序列化。为什么需要序列化协议? 序列化之后数据格式是二进制字节流,那么从哪里开始的字节流到哪里结束是一个整型(或者其他类型),这就需要序列化协议来表示。有人会问,FastJson 转换...

2020-01-16 14:14:03 155

原创 常用设计模式——状态模式

状态模式概念状态模式允许对象在内部状态改变时,改变它的行为。对象好像看起来修改了它的类。这个模式将状态封装成了独立的类,并将动作委托到当前状态的对象。状态模式用类代表不同的状态Context会将行为委托到当前对象状态转换可以由State类控制或者Context控制使用状态模式通常会导致程序中类的数目大大增加State可以被多个Context实例共享策略模式区别以状态模式...

2020-01-16 14:08:11 120

原创 常用设计模式——装饰模式

装饰者模式概念装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的方案装饰者与被装饰者有相同的超类型。你可以用一个或者多个装饰者包装一个对象既然装饰者与被装饰者有相同的超类型,所以可以使用装饰过的对象替换他。装饰者可以在被装饰者的行为之前/之后,加上自己的行为,已达到特定的目的对象可以在运行时被装饰缺点容易引入大量小类示例...

2020-01-16 11:49:31 122

原创 常用设计模式——责任链模式

责任链模式责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止。责任链模式的重点在“链上”,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果。角色抽象处理者(Handler)角...

2020-01-16 11:48:45 143

原创 常用设计模式——外观模式

外观模式概念提供了一个统一的接口,来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式不止简化了接口,也将客户端从组件的子系统中解耦。外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。示例/** * 外观对象 * @author Peter */public class Facade { //示意方...

2020-01-16 10:31:59 143

原创 常用设计模式——适配器模式

适配器模式概念将一个类的接口,转换成客户期望的另外一个接口。实际上适配器有2种,对象适配器和类适配器##对象适配器示例使用组合的方式实现,不仅可以适配某个类,还可以适配该类的子类。/** * 鸭子 * @author huangy on 2019-05-26 */public interface Durk { void quack(); void fly(...

2020-01-16 10:01:55 175

原创 基数排序原理及实战

基数排序原理我们来看这样一个排序问题。假设我们有 10 万个手机号码,希望将这 10 万个手机号码从小到大排序,你有什么比较快速的排序方法呢?我们之前讲的快排,时间复杂度可以做到 O(nlogn),还有更高效的排序算法吗?桶排序、计数排序能派上用场吗?手机号码有 11 位,范围太大,显然不适合用这两种排序算法。针对这个排序问题,有没有时间复杂度是 O(n) 的算法呢?现在我就来介绍一种新的排...

2020-01-12 13:35:14 359

原创 桶排序原理及实现

桶排序原理桶排序、计数排序、基数排序 三种排序算法的时间复杂度是 O(n) 。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作。首先,我们来看桶排序。桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据...

2020-01-12 13:33:30 1206

原创 聊聊三次握手

三次握手一次经典的三次握手的过程如下图所示:三次握手最重要的就是交换彼此的ISN。我们需要重点掌握的是包交互过程中序列号变化的原理。第一次握手客户端发送的一个报文段是 SYN 报文,这个报文只有 SYN 标记被置位。该SYN的作用是同步客户端的初始序列号。SYN报文不占用数据,但是它占用一个序列号(也就是占用1个字节)。下次发送的数据序列号要加1。客户端会随机选择1个数字作为初始序列...

2020-01-09 21:58:13 833

原创 Zookeeper—Leader选举

Leader选举概述在Zookeeper集群正常运行期间,一旦选举出Leader,所有服务器的集群状态一般不会发生改变,即使是新机器加入、非Leader机器挂了,也不会影响Leader。但是一旦Leader挂了,那么整个集群将暂时无法对外服务,而是进入新的一轮Leader选举。服务器运行期间的Leader选举和服务器启动期间的Leader选举基本过程是一致的。在服务器启动期间,如果超过2台机...

2020-01-05 14:30:18 288

原创 Zookeeper——谈谈ZAB协议

ZAB协议ZAB(原子消息广播协议)。在Zookeeper中,主要依赖ZAB协议来实现分布式数据一致性。Zookeeper使用一个单一的主进程来接收并处理所有客户端的事务请求(也就是一个请求,如果说HTTP请求),并采用ZAB的原子广播协议,将服务器的数据状态变更以事务提议的方式广播到所有的副本进程上。ZAB的核心是定义了事务请求的处理方式,即所有事务请求都必须由一个全局唯一的服务器来协...

2020-01-05 11:56:48 422

原创 Linux常用命令整理

Linux命令ssh登录远程服务器,shh 用户名@IP地址,例如 ssh [email protected]。登录之后,如果想退出,可以使用logout退出。常用参数:(1)-p : 指定远程服务器的端口tail从末尾查看文件,常用tail -f XXXX常用参数:(1)-f : 查看文件的新添加的内容(2)-n : n可以是任意数字,查看从末尾开始的n行head从头查...

2020-01-02 23:40:26 239

原创 设计原则

找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起把会变化的代码抽离并且封装起来,以后可以轻易改动这部分代码,而不会影响不需要变化的代码。针对接口编程,而不是针对实现编程主要是可以利用到多态运行时才指定具体实现的对象(比如是@Resource注入),从而执行该对象的具体实现方法。在运行时通过改变具体实现对象,从而改变执行的动作多用组合,少用继...

2019-12-30 17:19:07 117

原创 常用设计模式——桥接模式

桥接模式背景在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为 3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种...

2019-12-30 17:18:04 220

原创 常用设计模式——模板方法模式

模板方法模式概念在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法为我们提供一种代码复用的重要技巧。模板方法的抽象类可以定义具体方法、抽象方法。抽象方法由子类实现。为了防止子类改变模板方法中的算法,可以将模板方法声明为final。策略模式和模板方法模式都是封装算法,策略模式使用组合,模板方法模式使用继...

2019-12-30 17:15:59 140

原创 常用设计模式——命令模式

命令模式定义将"请求"封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象(就是命令对象拥有相同的接口,不同的命令对象可以被设置到调用者中)。命令模式也可以支持撤销操作。一个命令对象将动作和接受者封装到命令对象中,这个对象只保留出一个execute()方法,当此方法被调用时,接收者就会进行这些动作。从外面看,其他对象不知道究竟哪个接收者进行了哪些动作。一个调用者可以设置不...

2019-12-30 17:14:23 140

原创 常用设计模式——工厂模式

前言:曾经以为工厂模式很简单,其实不然,工厂模式有3种模式,下面分别阐述:简单工厂概念创建一个工厂对象,来封装创建对象的过程示例/** * 生产鸭对象的工厂 */public class DurkFactory { public Durk getDuck() { return new Durk(); }}工厂方法模式概念工厂方法模式定义...

2019-12-30 17:13:19 118

原创 常用设计模式——复合模式

复合模式概念复合模式结合两个或以上的模式,组成一个解决方案,解决问题。MVC和Model2属于复合模式。MVCMVC是复合模式的一种,结合了观察者模式、策略模式、组合模式。视图:用来呈现模型。视图通常直接从模型中取得它需要显示的状态和数据。视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。控制器:取得用户的输入,并解读其对模型的意思。控制器是视图的策略,...

2019-12-30 17:11:06 586

原创 常用设计模式——迭代器模式

迭代器模式概念提供一种方法顺序访问一个集合中的各个元素,而又不暴露其内部实现。示例演示了迭代器模式,遍历餐厅菜单的例子/** * 菜单项 * @author huangy on 2019-06-07 */public class MenuItem { private String name; private String description; ...

2019-12-30 17:04:49 146

原创 常用设计模式——单例模式

单例模式定义确保一个类只有一个实例,并且只提供一个全局访问点。饿汉模式加载类的时候就实例化对象/** * 饿汉模式 * @author huangy on 2019-05-25 */public class HunarySingle { /** * 在静态初始化器中创建单件。这段代码保证了线程安全 * 加载类的时候就初始化了属性。等到线程访问该属性的...

2019-12-30 17:03:55 181 1

原创 常用设计模式——代理模式

代理模式概念为一个对象提供一个替身,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问,目标对象可以是远程对象、创建开销大的对象、需要安全控制的对象。几种代理访问控制的方式远程代理 控制 访问远程对象。远程代理管理客户和远程对象之间的交互。远程代理作为远程JVM上对象的一个本地代表调用代理的方法,该方法会被代理利用网络转发到远程执行方法执行的结果会...

2019-12-30 17:03:10 99

原创 常用设计模式——策略模式

策略模式概念策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。策略对象需要实现相同的接口。实例/** * 鸭子类(客户端) * @author huangy on 2019-05-18 */public class Durk { protected FlyBehavior flyBehavior; public...

2019-12-30 17:02:23 112

原创 Spring事务—总结

Spring事务事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,...

2019-12-30 16:57:37 152

原创 MyBatis原理

MyBatis原理原理MyBatis启动时,解析mybatis的配置文件,并且从指定路径下解析mapper.xml配置文件把每条sql语句映射成MappedStatement然后把MappedStatement存放到Configuration的一个mappedStatements属性中(mappedStatements是一个HashMap),key为namespace + id,v...

2019-12-30 16:55:48 170

空空如也

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

TA关注的人

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