自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 NIO

BIO与NIOBIO同步阻塞,在调用read方法则会阻塞当前线程等待(从主存中DMA copy至内核缓冲区,然后利用cpu将内核缓冲区的数据读取至进程缓冲区)NIO过程一致,但是BIO需要一个线程监听一次读写状态,而NIO利用channal通道的概念,利用一个线程监听所有的通道(不断的自旋调用select(),查询是否可以读取),只要通道read完成,再通知读取线程读取BIO读写文件public void test(){ BufferedInputStream bf=new BufferedIn

2020-08-17 23:44:23 126

原创 平衡二叉树和红黑树

平衡二叉树AVL树是严格的平衡二叉树,平衡条件必须满足(所有结点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保存平衡,而因为旋转非常耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况红黑树保证五个条件(1)结点非红即黑(2)根结点是黑色的(3)每个叶子节点(NULL节点)是黑色的(4)每个红色节点的两个子节点都是黑色的。(不能有两连续的红色节点)(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。注意:

2020-08-15 15:30:03 303

原创 热加载和热部署

热加载常见的热加载用于开发当中,当我们修改代码的时候会自动重新编译被更改的class文件热加载原理1、容器启动的时候新建一条后台线程定时监听类文件的时间戳变化,变了就重新载入2、利用自定义classloader重新加载新的class文件热部署让JVM重新加载新的class文件热部署是部署服务器的一种方法,可以实现服务在运行过程中更新,服务自动重新打包部署,无需重启热部署原理与热加载原理类似,但是热部署主要是重新部署整一个项目,会释放内存,并且会清空session...

2020-08-14 17:50:14 190

原创 线程池

Reenstrant可重入锁,利用静态内部类Sync(继承自AQS)实现,将大部分方法直接委派给SyncLock()当锁获取失败时,到最后会调用AQS类中的addWaiter方法将线程封装成Node加入CLH队列

2020-08-13 22:29:15 103

原创 AQS原理

AQS全称AbstractQueuedSynchronizer抽象队列同步器,它提供了一个FIFO的队列用于实现同步锁以及其他涉及同步锁的核心组件(例如JUC下的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等)同步器主要支持实现独占锁,只有一个线程访问资源(ReentrantLock)共享锁,多个线程访问共享资源(ReentrantReadWriteLock)AQS类图AQS内部原理AQS内部维护一个FIFO双向

2020-08-12 22:50:59 323

原创 OAuth2.0

原因:解决用户第三方应用访问其他服务的授权问题第三方授权流程场景:我要去小程序上点外卖,小程序需要我的微信绑定的电话号码四种授权模式授权码授权详细过程:用户访问应用页面重定向到认证服务器认证服务器展示授权页面授权完成,然后认证服务器重定向到应用服务器,携带授权码code和client_id,然后利用client_id去后台查询对应资源服务器的client_secret携带code、client_id、client_secret请求认证服务器获取access_token和refr

2020-07-12 01:00:02 136

原创 JWT

JSON Web Token是作为多服务鉴权而存在的一个令牌(解决了多服务的鉴权问题)组成BASE64加密之后,分隔符为".",格式为(头部).(数据载体).(签名)头部指定了令牌类型和令牌签名算法{“typ”:“JwT”,“alg”:“HS256”}typ为令牌类型,alg为令牌签名的算法载荷(数据载体)定义了JWT的基本信息标准声明keyvalueissjwt签发者sub当前令牌描述说明aud接受jwt的一方expjwt的过期时间

2020-06-16 23:45:49 103

原创 Gateway

问题分布式项目多个服务对应着非常多的接口,服务器之间套接字难以管理安全隐患很大,暴露的接口增加导致服务器受攻击的面积增加多个服务之间请求资源可能存在跨域问题多个服务需要多次认证使用网关解决了接口多难以管理,并且安全隐患大的问题(只用对接网关微服务)解决了跨域问题解决了多服务认证问题日志统一管理...

2020-05-29 13:34:23 111

原创 Elasticsearch

作用用于部署全文搜索服务器,内核由Lucene编写实例修改config下elasticsearch.ymlps:启动有可能失败,由于ES消耗服务器资源较大,需要调整硬件容量限制

2020-05-20 13:13:51 97

原创 Canal数据同步

原理通过监听主数据库(目前只能监听Mysql)的DML操作log日志,以写入缓存数据库(Redis),相对应主数据库需要开启日志应用场景用于同步Mysql数据库信息实例首先需要开启Mysql的日志功能进入mysql文件夹下/etc/mysql/mysql.conf.d/mysqld.cnf,编辑添加log-bin=/var/lib/mysql/mysql-bin//日志保存路径server-id=12345//唯一标识保存后,即可开启Mysql日志功能创建账号,用于canal访

2020-05-16 10:08:05 547

原创 OpenResty

OpenResty是一个基于Nginx可伸缩的Web平台,集成了很多第三方模块(Lua),可以实现10K~1000K的并发链接响应的高性能Web应用请求非及时性资源实例配置一个请求缓存(高并发请求资源)用户通过链接访问Nginx(NginX-OpenResty),将需要请求指定资源的会话拦截,并从OpenResty Cache(Nginx-Cache)中请求资源,如果查询不到则继续下一步,查询到了就直接返回资源通过OpenResty集成的Lua脚本配置,请求本地Redis缓存,如果查询不到则继续下

2020-05-15 11:19:13 175

原创 Lua

由C语言开发的脚本语言(已开源),用于给应用程序提供扩展性和定制功能,但是无法作为应用程序开发语言(没有开发库),可以用于开发歪瓜(CF)特性支持面向过程编程和函数式编程;自动内存管理;只提供了一种通用类型的表,用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;支持多线程;...

2020-05-14 14:47:39 133

原创 FastDFS工作机制

作用:分布式文件管理,可以部署在多文件服务器集群项目上,进行项目文件管理(文件上传,文件删除,文件下载)Tracker:分布式文件服务器注册中心Storage:以group组为单位,一个组内包含多个分布式文件服务器的信息(套接字),组内服务器之间保持冗余同步(容灾机制)文件上传时的流程图:文件下载时的流程图:...

2020-05-06 12:06:50 239

原创 常见的几种网络Hack方式

DDoS全称Distributed Denial of Service,中文名“分布式拒绝服务”,服务面向大众就一定会提供用户访问的接口,利用大量合法的分布式服务端对目标接口发送请求,导致应用服务器拥塞而无法对外提供正常服务,从而导致正常合法的用户无法正常获得服务攻击方式资源消耗通过大量请求消耗服务器正常带宽和协议栈处理资源能力服务消耗通过请求服务端高消耗型业务,例如文件下载反射...

2020-03-15 00:43:57 1705

原创 阿里夺命300问

1、 meta标签的作用是什么标注HTML字符集、使用语言、作者等基本信息外,还涉及对关键词和网页等级的设定,对搜索引擎优化有帮助,对用户是不可见的2、 ReenTrantLock可重入锁(和synchronized的区别)总结3、 Spring中的自动装配有哪些限制?4、 什么是可变参数?5、 什么是领域模型(domain model)?贫血模型(anaemic domain mo...

2020-03-07 14:54:28 331

原创 类加载器

类加载器类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。例如,如果在pg的包中有一个名为Pers...

2020-01-15 22:18:51 440

原创 强软弱虚,用到的场景

强引用内存不足时,垃圾回收器也绝不会回收具有强引用的对象,然后内存溢出并报错OOM经典的强引用Object oj=new Object();这时不管Object对象是否被使用,垃圾回收器永远都不会回收这个强引用所指向在堆中的Object对象,以防内存不足时造成的困扰,我们可以将它设置为nulloj=null;//变成弱引用方便GC算法查找未被使用的对象软引用内存不...

2020-01-15 22:18:42 216

原创 分代回收算法

Java中所有在堆中的新建的对象都需要经历garbage collect过程1、新生代新建的对象此时此刻还是一个初出茅庐的小伙子,踏进堆中发现一个8:1:1的空间,最大的空间我们把它叫做Eden,两个小的空间我们都叫Survice,他发现这里的垃圾是这样回收的这就是标记复制算法2、年老代经历过多次标记复制还存活下来的对象,由于一个Survice区已经容不下这么对象了,所以把它们放到年...

2020-01-15 22:18:31 733

原创 JVM内存模型

JVM逻辑分区主要分为5个主要的模块线程私有:本地方法栈,程序计数器,虚拟机栈线程共享:堆,方法区程序计数器:很小的一部分空间,给每一个线程单独分配的行指示器,唯一一个不会OOM的内存空间由于多个cpu与主存交互时会有多个cpu私有的高速cache,因为只有一个主存,所以需要一个内存屏障(读写锁)来管理这些高速缓存,那么写的时候有可能会有线程切换的情况,这时候程序计数器就能记录切换之前...

2020-01-15 22:18:31 112

原创 面向对象设计原则

设计模式就是为了让代码复用性提高,所谓的复用性就是将需求变化带来的变化影响到最小多态就能很好体现了抽象带来的便利,由一个对象接口多种不同的实现,转而交给程序判断对象应该是什么样子衡量设计模式使用的是否正确,应该用尺子(面向对象设计原则)衡量依赖倒置原则:稳定的类和不稳定的类中依赖关系分离出来,将他们共同指向并依赖于一个抽象的对象(由JVM编译器管理(多态接口,继承))高层模块(稳...

2020-01-15 22:18:25 86

原创 Template Method

Template Method主要利用抽象方法给应用提供扩展点,并在方法中实现控制反转,被Template Method调用的抽象方法可以protected在方法中需要知道需求中变化点和相对稳定的地方,将其区分开来,稳定的部分放入方法中,变化的部分做成抽象方法暴露给子类,让子类自己实现,这样实现了晚绑定public class templateMethodTest{ protected vo...

2020-01-15 22:18:19 87

原创 抽象工厂

动机:一系列相互依赖的对象创建,为了避开new所带来的紧耦合

2020-01-15 22:17:54 82

原创 工厂模式

动机:传统创建对象必须用new的方式,为了解决new带来的紧耦合缺点:每个create方法返回对象都必须参数相同,因为他们都继承了SpilitterFactory基类class Splitter{ void split();}class FileSplitter extends Splitter{ @Override void split(){ //... }}clas...

2020-01-15 22:17:48 91

原创 代码执行顺序

public class StaticTest {public static int k = 0;public static StaticTest s1 = new StaticTest("s1");public static StaticTest s2 = new StaticTest("s2");public static int i = print("i");public stat...

2020-01-15 22:17:38 158

原创 Bridge模式

动机:由于某些类型具有多种不同方向的变化(平台与实现),应对多维度的变化解耦合class Message{ public login(){ ... } public play(){ ... }}class PCMessage extends Message{ @Override public play(){ ... }}class PEMessage extends Mes...

2020-01-15 22:17:35 127

原创 线程池的使用

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);...

2020-01-15 22:17:32 103

原创 逃逸分析

逃逸分析是JIT即时编译器中的一个重要的优化手段,动态的编译热点代码并进行逃逸分析,标量替换,锁消除优化代码,JDK1.8默认全部开启逃逸分析:分析对象动态的作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸public static StringBuffer createStringBuffer1(String s1, String ...

2020-01-15 22:17:27 129

原创 反射机制

反射就是把java类中的各种成分映射成一个个的Java对象一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。每一个对象都只有一个Class对象存放对象类的一些信息,多的只是对象空间下面来点实例:1、获取class对象的三种方法obj.getClass()obj.classClass.forName(“obj”)...

2020-01-15 22:17:16 120

原创 代理模式

动机:对象创建开销很大,某些操作需要安全控制,或者需要进程外的访问class IA{ public void precess();}class A implements IA{ @Override public void precess(){...}}class ClientApp{ IA ia; public void doingSomething(){ .....

2020-01-15 22:16:41 84

原创 门面(Facade)模式

动机:接口之间如果有依赖,需要添加一层(稳定)接口解耦合例如:假设A方案是MYSQL的连接模型,如果按照A方案设计的话,客户需求改动(改成ORACLE),那么A方案中子类的代码改动就会非常大假设B方案,子类还是需要改动,但是Facade向外暴露的是相同的接口,所以外部的方法不用变化也就是Facade向外提供了一个(稳定)的接口Facade设计模式更重要的是从架构层次看系统,主要是隔离作...

2020-01-15 22:16:38 145

原创 享元模式

动机:大量的对象(几万个,几十万个)导致程序内存需求变得非常大,享元模式就能解决当前问题(线程池,常量池)class Font{ String key;}class FontFactory{ private HashMap<String,Font> fontPool; public Font getFont(String key){ if(fontPool.con...

2020-01-15 22:16:32 78

原创 集群、分布式、微服务概念和区别

集群(物理部署方式)将同一个业务,部署到不同的服务器上例如:一个网页访问的量很大,然后可以做一个集群,设置一个响应服务器,看部署了同一服务的服务器哪个比较“有空”,就将任务下发给它优点:在单位时间内,通过服务器的数量有效的解决了同一时间内,任务过多的问题,可以分发给不同的服务器处理缺点: 如果是有依赖关系的任务,从根本上还是只能由一台服务器处理,效率低下外部访问服务通过Ng...

2020-01-15 22:16:26 267

原创 内存屏障和volatile

内存屏障存在的原因:为了提高CPU的IO速度,除了主存以外设有高速缓存,CPU读取和写入的时候不能够获取到“最新的信息”(与主存交互),而多线程模式下方法区和堆中的变量有可能缓存从而导致“”脏数据“内存屏障作用:阻止屏障两边reOrder强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效对于Load Barrier(读屏障):在指令前加入的话,会强制从主存中读...

2020-01-15 22:16:20 234

原创 单例模式

动机:对于面向对象编程,总会有对象的存在,有时候希望在系统中只需要一个实例,这时候可以从性能上考虑优化使用单例模式class SingleClass{ //c++需要声明这个私有构造器, private SingleClass singleClass; public Lock lock; private SingleClass(){ ... } //线程不安全 public Si...

2020-01-15 22:16:11 106

原创 三次握手和四次挥手的理解

1.源端口和目的端口,各占两个字节,分别写入源端口和目的端口;2.序号seq,占4个字节,TCP连接中传送的字节流中的每个字节 都按顺序编号,例如,一段报文的序号字段值是101,携带的数据共有100字段,则下一段报文(如果存在下一个报文)的数据序号就应该从201开始;3.确认号ack,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如B收到了A发送过来的报文,其序列号是201...

2020-01-15 22:16:02 172

原创 构建器模式

动机:创建一个复杂的对象,这个对象各个部分剧烈变化,但是组合到一起却相对稳定(跟Template Method很像)在这里插入代码片

2020-01-15 22:15:27 99

原创 原型模式

动机: 隔离某些结构复杂的对象创建工作class ISplitter{ public void split();}class ISplitterFactory{ public ISplitter createISplitter(...);}class FileSplitter extends ISplitter implements ISplitterFactory{ @Ove...

2020-01-15 22:15:25 80

原创 组合模式

动机:由于有些对象独特的数据结构,

2020-01-15 22:15:13 107

原创 状态模式

动机:对象的状态经常面临变化,但是对象又需要有效的管理

2020-01-15 22:15:09 111

原创 备忘录模式

动机:要求程序回溯到对象之前处于某个节点时的状态,如果使用一些公有接口来获取对象状态,这样会暴露细节实现class Memento{ }

2020-01-15 22:15:07 89

空空如也

空空如也

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

TA关注的人

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