框架基础之SPI机制

1 定义 SPI 的全名为 Service Provider Interface ,用于接口寻找服务实现类 实现方式 >标准制定者制定接口 不同厂商编写针对于该接口的实现类,并在jar的“classpath:META-INF/services/全接口名称”文件中指定相应的实现类全类名 开发者直接引入相应的jar,就可以实现为接口自动寻找实现类的功能 2 案例实现 比如我们经常看到的缓存类Cache,现在有非常多的缓存框架都会去实现这个接口

实际项目运用之Responsibility-Chain模式(责任链模式)

1 模式概要 1.1 简介 责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止 1.2 责任链模式优缺点 优点 >降低耦合度。它将请求的发送者和接收者解耦 简化了对象,使得对象不需要知道链的结构 增强给对象指派职责的灵活性,允许动态地新增或者删除责任链 增加新的请求处理类方便

JNDI知识摘要

#1 什么是JNDI? JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互 通过JNDI可以实现对象的创建与托管,和对象的使用过程完全解耦 比如:在application的底层创建对象,并将对象bind到特定的context中,对象的创建过程或者”查找”方式只有此底层模块支持,外部程序不可见.对于对象的使用者(调用者)只能通过JNDI的方式获取对象,对象使用者无法直接创建对象等 #2 JNDI架构 关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很像JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,我们不必操心JNDI SPI的具体实现。只需要确认要使用的某一个命名或目录服务都有服务提供者。

技术图谱

《后端架构师技术图谱》 数据结构 队列 《java队列——queue详细分析》 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。 阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析》 集合 《Java Set集合的详解》 链表、数组 《Java集合详解–什么是List》 字典、关联数组 《Java map 详解 - 用法、遍历、排序、常用API等》 栈 《java数据结构与算法之栈(Stack)设计与实现》 《Java Stack 类》 《java stack的详细实现分析》 Stack 是线程安全的。 内部使用数组保存数据,不够时翻倍。 树 二叉树 每个节点最多有两个叶子节点。 * 《二叉树》

设计模式之单例模式终极版【克隆-序列化-反射】

1 基本内容 1.1 概念 单例模式,是指在任何时候,该类只能被实例化一次,在任何时候,访问该类的对象,对象都是同一个。只要是程序员都会使用到,甚至都不能算是设计模式。但是在我们使用中也需要了解一下单例特性和使用场景 1.2 模式优缺点 单例模式有以下优点: >使用单例模式可以严格的控制用户怎样以及如何访问它 节约系统资源,提高系统的性能 单例模式有以下缺点: >不易扩展 单例类职责过重,在一定程度上违背了“单一职责原则” 如实例化对象长时间未使用,会GC回收,导致对象状态的丢失

Fail-Fast和Fail-Safe机制

1 Fail-Fast 1.1 fail-fast定义 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件 例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件 1.2 Iterator与fast-fail机制 1.2.1 Iterator的好处 java源码中迭代器模式主要用于集合的迭代,只要实现了Collection接口就可以使用迭代器去遍历获取元素,这样我们不需要了解遍历的内部实现细节。 比如下面的 ArrayList 和 ImmutableList 遍历的例子:

实际项目运用之Adapter模式(适配器模式)

1. 模式简介 适配器模式解决的问题:让原本因为接口不兼容而不能一起工作的类可以一起工作 适配器模式中有三种角色: 目标接口Target:用户期望的类,可以是接口,也可以是抽象类或具体类; 需要适配的类Adaptee:当前系统中有的类; 适配器Adapter:在现有接口和目标接口之间的“适配者” 适配器模式的优点: 通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦; 复用了现存的类,解决了现存类和复用环境要求不一致的问题; 将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。

设计模式之Template模式(模版模式)

1 模式简介 1.1 模版方法模式的定义: 模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 1.2 结构 1.3 模式的组成 抽象类(AbstractClass): 定义抽象的原语操作(primitive operation) ,具体的子类将重定义它们以实现一个算法, 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义。 具体子类 (ConcreteClass): 实现原语操作以完成算法中与特定子类相关的步骤。

synchronized实现原理及锁优化

1.引言 并发编程中synchronized是重量级锁,但随着JVM1.6对synchronized进行优化后,有些情况下它并不那么重,本文介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。 2.术语定义 CAS(Compare and Swap): 比较并交换。用于在硬件层面上提供原子性操作。在 Intel 处理器中,比较并交换通过指令cmpxchg实现。比较是否和给定的数值一致,如果一致则修改,不一致则不修改。 3.同步的基础 Java中的每一个对象都可以作为锁。 对于同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前对象的Class对象。 对于同步方法块,锁是synchonized括号里配置的对象。