自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一把空心菜

The night is young

  • 博客(105)
  • 收藏
  • 关注

原创 Java 设计模式 - 单例模式

基本概念单例模式具有以下特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。它的作用如下:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。省去了 new 操作符,降低了系统内存的使用频率,减轻 GC 压力。有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同

2020-05-17 21:16:04 382

原创 Dubbo-扩展机制

一、基本概述前言Dubbo 框架设计采用了[微内核+插件]的方式,以此来保证框架整体的灵活性,在提升可定制性的同时,避免了自身的臃肿。通过将原本与内核集成在一起的组件分离出来,只提供了特定的接入接口,组件可以独立的发展、更改而不会对现有系统造成改动。Dubbo 的扩展机制基于 Java 的 SPI,但又不同于它。这里由于篇幅缘故,不再介绍 JDK 的 SPI 机制。它具有以下特点:Dub...

2018-11-10 19:57:26 936

原创 02.Java 多线程 - Thread

基本概念进程 & 线程的概念:进程:在某种程度上表示相互隔离的、独立运行的程序。线程:也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。进程 & 线程的区别:与分隔的进程相比,进程中的线程之间的隔离程度要小。进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这

2017-03-05 21:27:01 599

原创 03.Spring IoC 容器 - 初始化

基本概念Spring IoC 容器的初始化过程在监听器 ContextLoaderListener 类中定义。具体由该类的的 configureAndRefreshWebApplicationContext 方法实现,它包含了两个过程:配置过程重刷新过程原理分析下面来看 configureAndRefreshWebApplicationContext 方法的具体实

2017-03-05 16:53:37 580

原创 Java 设计模式 - 桥接模式

基本概念桥接模式的动机:由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。桥接模式的作用:桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。桥接模式的角色:Implementor,实现类接口。ConcreteIm

2017-03-04 18:10:47 713

原创 Java 设计模式 - 外观模式

基本概念外观模式的作用:降低系统的复杂程度,提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。外观模式的角色:SubSystem,子系统角色。表示一个系统的子系统或模块。Facade,外观角色,客户端通过操作外观角色从而达到控制子系统角色的目的。对于客户端来说,外观角色好比一道屏障,对客户端屏蔽了子系统的具体实现。实例探究假设一台电脑,它包含了 C

2017-03-04 17:06:49 901

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

基本概念代理模式的作用:代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介代理模式的角色:Subject,抽象角色,通过接口或抽象类声明真实角色实现的业务方法。RealSubject,真实角色,实现抽象角色,实现抽象角色定义的业务逻辑,供代理角色调用。Proxy,代理角色,通过接口或抽象类声明真实角色实现的业务方法。实例探究Subject,抽象角色。p

2017-03-04 16:50:08 390

原创 Java 设计模式 - 装饰者模式

基本概念装饰者模式的作用:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。适配器模式的角色:Component,抽象构件,它表示定义了某种功能的接口ConcreteComponent,具体构件,实现了构件接口(Component),表示实现具体功能的类。Decorator,抽象装饰类,与 Component 关联并

2017-03-04 16:31:14 447

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

基本概念适配器模式的作用:将某个类的接口转换成客户期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。适配器模式的角色:Adaptee,被适配者,需要被适配的类。Target,目标类,即需要实现功能的接口或抽象类。Adapter ,适配器,拥有目标类的功能,以及被适配者的功能。适配器模式的类型:类适配器,通过适配器继承被适配者实现对象适配器,通过适配器关联被适配者实

2017-03-04 14:07:41 322

原创 Java 设计模式 - 建造者模式

基本概念建造者模式的作用:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式的角色:Product,即产品,表示被建造的对象。该对象一定是个复杂对象,由各个部件组合而成。Builder,即建造者接口,它的作用为创造产品的各个部件。ConcreteBuilder,即具体的建造者,用于创建具体的产品部件。Director,即指挥者,负责通过调用不同的建造者

2017-03-04 13:17:41 550

原创 16.Java 基础 - Comparable & Comparator

基本概念Comparable & Comparator 的定义如下:当一个类实现了 Comparable 接口,表示该类支持排序。当一个类实现了 Comparator 接口,表示该类是一个比较器。当一个类不支持排序,即未实现 Comparable 时。要对该类的对象集合或数组进行排序:修改类的结构,该类实现 Comparable 接口。不修改类结构,新建类实现 Comparator 接口

2017-03-03 16:49:34 363

原创 06.Java 关键字 - switch

基本概念switch 语句同 if 条件语句的作用一样,都是用来判断条件的。具体形式如下:switch (key) {case 1: //do something... break;default: //do something... break;}需要注意的是:switch 语句可以处理 int,short,byte,char 类型的值,但是不能处理 lon

2017-03-02 21:45:10 424

原创 05.Java 关键字 - forEach

基本概念forEach,其实不是个关键字,它表示一种循环。具体形式如下:for(String str : stsr){ //do something ...}原理分析1.数组在数组里面,foreach 是使用的 for 循环遍历。String a = "abc";for (char item : a.toCharArray()) { System.out.println(item

2017-03-02 21:11:57 608

原创 04.Java 关键字 - volatile

基本概念在 Java 中,通过使用 volatile 变量,用来确保将变量的更新操作通知到其他线程。即被 volatile 修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新值。它是一种比 synchronized 更弱的同步机制,它只能保存变量的可见性、有序性,而不能保证原子性。内存模型Java 内存模型具有以下特点:所有的变量都是存在主存当中。每个线程都有自己的工作内存,并且不

2017-03-02 19:23:17 297

原创 03.Java 关键字 - transient

基本概念在介绍 transient 关键字之前,要了解序列化的概念。该关键字具有以下特点:只能修饰成员变量,而不能修饰方法入参、方法、类。被其修饰的变量,表示该类变量是瞬态的,常规情况下无法被序列化。 若类实现了 Externalizable 接口或自定义序列化过程,被修饰的变量也能被序列化。实例探究下面来看具体的例子:定义一个 Person 类,并实现了 Serializable 接口

2017-03-02 18:29:50 378

原创 12.SpringMVC 视图解析 - View

View即视图,负责页面的渲染。接口定义如下:public interface View { void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;}再来看它的继承关系(部分显示):AbstractView该类

2017-03-02 09:26:23 561

原创 08.SpringMVC 处理器 - HandlerMethod

**基本概念我们知道在 SpringMVC 中 控制器(Controller)负责对请求路径进行匹配并调用相应地执行方法。而 HandlerMethod 就表示这个方法, 但它一般也被称作处理器,即 handler。因为它身上包含了控制器信息、控制器的指定方法信息。内部构造下面来看它的构造函数,需要关注的是它的几个成员变量:public HandlerMethod(Object bean, Meth

2017-03-02 09:17:50 2232

原创 07.SpringMVC 请求处理 - HandlerExecutionChain

基本概念HandlerExecutionChain,即处理处理链。它包含了:一个处理器,即 HandlerMethod多个拦截器,即 HandlerInterceptor内部构造来看它的构造函数:private final Object handler;private HandlerInterceptor[] interceptors;private List<HandlerInterce

2017-03-02 09:16:51 4241

原创 06.SpringMVC 请求处理 - DispatcherServlet

基本概念DispatcherServlet 是整个 SpringMVC 的核心,请求处理的具体细节在该类的 doService 方法中定义。原理分析下面来看该类的 doService 方法:// 在 include 请求之后清除请求属性private boolean cleanupAfterInclude = true;protected void doService

2017-03-02 09:14:45 568 1

原创 05.SpringMVC 请求处理 - FrameworkServlet

基本概念首先来看下 SpringMVC 中请求处理的大致流程:在 Servlet 中 service 方法负责请求处理。该方法在其子类 HttpServlet 中被重写。在 HttpServlet 中,通过区分不同的请求类型,而采取不同的动作,如 doGet 负责 GET 请求、doPost 负责 Post 请求等。这些方法在其子类 FrameworkServlet 中也被重写。在 Frame

2017-02-28 13:16:24 1354 2

原创 03.JUC 集合 - BlockingQueue

概念BlockingQueue,即阻塞队列。它是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景:生产者是往队列里添加元素的线程。消费者是从队列里拿元素的线程。操作阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时

2017-02-23 22:37:55 293

原创 05.JUC 集合 - LinkedBlockingQueue

基本概念LinkedBlockingQueue 是一个用链表实现的有界阻塞队列。LinkedBlockingQueue 按照先进先出的原则对元素进行排序。LinkedBlockingQueue 采用了双锁、双条件队列来提高读写效率。内部构造LinkedBlockingQueue 内部维护着一个单向链表,且链表头节点的值永远为空。如下图所示:下面来看它的构成:Node ,节点static clas

2017-02-23 19:19:46 296

原创 04.JUC 集合 - ArrayBlockingQueue

基本概念ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下不保证访问者公平的访问队列,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程,可以先从队列里获取元素。内部构造构造函数,ArrayBlockin

2017-02-23 19:19:01 345

原创 02.JUC 集合 - ConcurrentHashMap

基本概念ConcurrentHashMap 采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个 Map 加锁的设计,分段锁大大的提高了高并发环境下的处理能力。内部构造ConcurrentHashMap 实际上是由多个 Segment(分段)组成, Segment 的内部结构与 HashMap 一样,都是由哈希表构成。因此也可以理解为由多个 “HashMap

2017-02-23 12:57:45 323

原创 01.JUC 集合 - CopyOnWriteArrayList

基本概念CopyOnWriteArrayList 的实现原理实际与 ArrayList 大同小异。它们内部都通过维护一个数组来对数据进行操作。不同的是它的处理写操作(包括 add、set、remove)是先将原始的数据通过Arrays.copyof 方法复制生成一份新的数组。然后在新的数据对象上进行写操作,写完后再将原来的引用指向到当前这个数据对象。这样保证了每次写都是在新的对象上。而 ArrayL

2017-02-23 11:41:23 311

原创 12.JUC 锁- CyclicBarrier

基本概念CyclicBarrier ,也称可重用屏障是一个线程同步工具,用于一组互相等待线程之间的协调,在到达某个临界点之前,这些线程必须互相等待。通俗来讲,表示 n 个线程,大家相互等待,只要有一个没完成,所有人都得等着。CyclicBarrier 还允许指定一个任务,在所有线程到达临界点时执行,由最后到达的线程执行此任务。调用方法假设有场比赛,需要 3 个选手才能比赛。若存在选手未到达,则必须等

2017-02-22 23:37:10 326

原创 11.JUC 锁 - Semaphore

基本概念Semaphore 即计数信号量,它本身维护着一组permit(许可)。它本质是共享锁,通过修改 permit 的值来调整可以被多少个线程同时持有。当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。acquire ,表示获取信号量的许可;调用该方法时,在没有可用的许可前线程将阻塞。release ,表示添加一个可用许可;调用该方法时,可以添加一个许可,即

2017-02-22 23:19:40 524

原创 10.JUC 锁- CountDownLatch

基本概念CountDownLatch 这个类能够使一个或多个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。调用方法假设有工人、老板两种角色。工人负责工作,老板负责检查工人已完成的工作。那么存在以下条件:老板必须等待工人完成工作后才能进行检查。工人public class Worker implements Runnab

2017-02-22 22:57:57 594

原创 09.JUC 锁 - ReentrantReadWriteLock

基本概念ReadWriteLock (读写锁)内部维护着两个锁,一个用于写操作,即写锁;一个用于读操作,即读锁。写锁,是独占锁,即只能被一个线程持有。读锁,是共享锁,即可以同时被多个线程持有。它的接口定义如下:public interface ReadWriteLock { Lock readLock(); Lock writeLock();}ReentrantReadWri

2017-02-22 22:12:06 694

原创 08.JUC 锁 - ReentrantLock

基本概念ReentrantLock,即可重入锁。可重入锁指的是在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁。内部构造首先来看它的继承关系:在 ReentrantLock 有三个重要的内部类:// 同步器static abstract class Sync extends Abstrac

2017-02-22 20:55:00 452

原创 07.JUC 锁 - AQS - Condition

基本概念Condition ,即条件(也称为条件队列或条件变量)。它主要是为了在 JUC 框架中提供和 Java 传统的监视器风格的 wait、notify、notifyAll 方法类似的功能。Condition 自己也维护了一个队列,该队列的作用是维护一个等待 signal 信号的队列,两个队列的作用是不同,事实上,每个线程也仅仅会同时存在以上两个队列中的一个。将设有线程 1、2,下面来具体过程。

2017-02-22 20:47:21 1711

原创 06.JUC 锁 - AQS - 共享模式

基本概念AQS 的共享模式,表示 AQS 通过共享模式获取/释放锁。该类对应的方法为 acquireShared/acquireSharedInterruptibly/tryAcquireSharedNanos、 releaseShared。acquireSharedacquireShared 表示以共享模式获取锁对象,并忽略中断。public final void acquireShared(in

2017-02-22 16:44:03 629

原创 04.JUC 锁- AQS - CLH 队列

基本概念首先我们需要知道两个概念:AQS、CHL 队列。AQS:即 AbstractQueuedSynchronizer 类,它是整个 J.U.C 框架的核心所在。其中之一的功能就是将线程封装在一个节点里面,不同的节点通过连接形成了一个 CHL 队列。CHL 队列:它是一个非阻塞的 FIFO 队列,也就是说在并发条件下往此队列做插入或移除操作不会阻塞,它通过自旋锁和 CAS 保证节点插入和移除的

2017-02-22 15:53:58 1570

原创 02.JUC 锁 - CAS

基本概念CAS(compare and swap),即比较并交换。它在 J.U.C 包中被广泛使用。是一种对内存中的共享数据进行操作的指令,而且该操作是原子的读写操作。CAS 操作包含三个操作数:内存位置(V)、预期原值(A)以及新值(B)。它具有以下特点:当且仅当 A 和 V 相同,将 V 修改为 B ,否则什么都不做。锁机制在分析 CAS 的原理之前,先来介绍下 Java 的锁机制。常见的锁

2017-02-22 15:17:30 511

原创 03.JUC 锁 - LockSupport

基本概念LockSupport 可以用来实现线程的阻塞/唤醒。每个使用 LockSupport 的线程都会与一个许可关联:若该许可有效,则线程可以继续执行。若该许可无效,则线程进入阻塞,等待许可证生效后再继续执行。关于许可,可类比为停车场的车位:若车位是被占用(即不可用),想要停车(park)则必须等待车位空余出来。通过 unpark 把车位空出来(即可用),则就可以直接停车。关于 Lo

2017-02-13 09:27:08 303

原创 01.JUC 锁 - 概述

基本概念J.U.C 包是 java.util.concurrent 包的简写。这个包在JDK5引入,大大增强了Java的并发特性。JDK7还引入ForkJoin框架。在 JUC 中,并发离不开锁,因为锁,才能真正实现并发访问。锁的框架如下: ](https://static.oschina.net/uploads/img/201702/12215540_3JWz.png “在这里输入图片标题”)C

2017-02-12 22:03:13 501

原创 Spring 配置使用 - AOP 通知参数

基本概念若想要在通知方法获取被通知方法的参数共有两种方式:自动获取、手动指定。下面来探究下这两种方式的不同之处。自动获取参数在介绍 AOP 的通知类型时有提到过环绕通知,该通知类型可以通过参数 ProceedingJoinPoint 自动获取被通知方法的参数值并调用该方法。除了 ProceedingJoinPoint 外,还有 JoinPoint,JoinPoint.StaticPart 也都能自动

2016-10-17 23:13:31 3961

原创 Spring 配置使用 - AOP 通知类型

基本概念AOP,即 Aspect-Oriented Programming(面向切面编程),它其实是 OOP(Object-Oriented Programing,面向对象编程)思想的补充和完善。在使用 Spring AOP 之前,首先需要掌握以下几个常用术语:1.aspectaspect,即切面。切面是通知和切点的结合。通知和切点共同定义了关于切面的全部内容。2.adviceadvice,即通知。

2016-10-13 22:55:44 4854

原创 Spring 配置使用 - Bean 生命周期

基本概念Spring 中的 Bean 的生命周期,指的是 Bean 从创建到销毁的过程。下面来探究下几个有关 Bean 生命周期配置的属性。lazy-initlazy-init 表示延迟加载 Bean,默认在 Spring IoC 容器初始化时会实例化所有在配置文件定义的 Bean,若启用了 lazy-init 则在调用 Bean 时才会去创建 Bean。-定义 Bean:public class

2016-10-08 22:49:54 1151

原创 Spring 配置使用 - Bean 作用域

基本概念Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围。在 Spring IoC 容器中具有以下几种作用域:基本作用域(request、prototype),Web 作用域(reqeust、session、globalsession),自定义作用域。Spring 的作用域在装配 Bean 时就必须在配置文件中指明,配置方式如

2016-10-08 21:59:38 4762

空空如也

空空如也

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

TA关注的人

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