JDK设计模式(六)桥接模式

1、定义将抽象部分与实现部分分离,使它们都可以独立的变化 2、解决的问题某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿,把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要,从达到抽象化、实现化和脱耦。 3、模式中的角色1、抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。2、修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。3、实现化(Implementor)角色:这个 ...

JDK设计模式(五)适配器模式

1、定义将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 2、解决的问题即 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 3、模式中的角色目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。需要适配的类(Adaptee):需要适配的类或适配者类。适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 4、模式解读在 GoF 的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。由于类适配器模式通过多重继承对一个接 ...

JDK设计模式(四)原型模式

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。在原型模式中,所发动创建的对象通过请求原型对象来拷贝原型对象自己来实现创建过程,当然所发动创建的对象需要知道原型对象的类型。这里也就是说所发动创建的对象只需要知道原型对象的类型就可以获得更多的原型实例对象,至于这些原型对象时如何创建的根本不需要关心,其类图如下所示。原型模式主要包含如下三个角色: Prototype:抽象原型类。声明克隆自身的接口。 ConcretePrototype:具体原型类。实现克隆的具体操作。 Client:客户类。让一个原型克隆自身,从而获得一个新的对象。 讲到原型模式,我们就不得不区分两个概念:深拷 ...

Java引用类型

内存回收每一个 Java 程序中的对象都会占用一定的计算机资源,最常见的,如:每个对象都会在堆空间上申请一定的内存空间。但是除了内存之外,对象还会占用其它资源,如文件句柄,端口,socket 等等。当你创建一个对象的时候,必须保证它在销毁的时候会释放它占用的资源。否则程序将会在 OOM 中结束它的使命。在 Java 中数据内存分配发生在栈和堆中,对于栈中的变量(引用类型,基本类型)会在方法的退出时自动释放,对于 new 出来对象分配到堆中,不需要程序员来管理内存的分配和释放,Java 有自动进行内存管理的神器——垃圾回收器,垃圾回收器会自动回收那些不再使用的对象。那如何判断对象不再使用呢?就是 ...

Java锁(五)CyclicBarrier分析

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier 默认的构造方法是 CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然后当前线程被阻塞。 1、CyclicBarrier 使用实例public class CyclicBarrierTest { stat ...

Java锁(四)ConditionObject分析

在讲 ConditionObject 之前,先讲解下条件队列。条件队列能够使得一组线程能够通过某种方式来等待特定的条件变成真,条件队列中的成员是一个个正在等待状态的线程。条件队列提供了一种挂起方式,当现场等待的条件非真时,挂起自己并释放锁,一旦等待条件为真,则立即醒来。 条件队列主要功能1、隐式锁对应的条件队列对象的内置锁(synchronized 语义对应的同步机制),关联着一个内置的条件队列。Object 的 wait/notify/notifyAll 等方法构成了内部条件队列的 API(即将内部锁与内部条件队列关联的机制)。 内部条件队列是需要内置锁保护的,需要调用对 ...

Java锁(三)CountDownLatch共享锁分析

在开始解读 AQS 的共享功能前,我们再重温一下 CountDownLatch,CountDownLatch 为 java.util.concurrent 包下的计数器工具类,常被用在多线程环境下,它在初始时需要指定一个计数器的大小,然后可被多个线程并发的实现减 1 操作,并在计数器为 0 后调用 await 方法的线程被唤醒,从而实现多线程间的协作。 1、闭锁使用class Driver2 { void main() throws InterruptedException { CountDownLatch doneSignal = n ...

Java锁(二)ReentrantLock独占锁分析

ReentrantLock 的功能是实现代码段的并发访问控制,是一种排它锁,也就是通常意义上所说的锁,内部有两种实现 NonfairSync 和 FairSync,公平锁和非公平锁,默认采用非公平锁策略。ReentrantLock 的实现不仅可以替代隐式的 synchronized 关键字,而且能够提供超过关键字本身的多种功能。 1、ReentrantLock 的使用class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() ...