GW Blog

Never stop thinking, never stop moving.

模板方法

《大话设计模式》第10读书笔记,介绍模板方法

模板方法模式,定义一个操作系统中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 其实就是相当于把一些公共的方法提出到模板类里面,然后把一些不同的部分放到子类中进行具体实现。就像从一个模板衍生出的不同图案。 AbstractClass是抽象类,也就是抽象模板,定义并实现了一个具体的模板方法,其中调用了抽象操作由子类来完成...

原型模式

《大话设计模式》第9读书笔记,介绍原型模式

复制对象实例 我们知道在Java这样面向对象的语言中,对于非基本数据类型的对象,它的值实际上是引用值,也就是说Object b = a会导致b和a指向同一个实例,对任意一个引用的实例修改都会反映在这个相同的实例上。所以,如果要产生两个一模一样的实例,必须要重新实例化一个对象,并且同样的进行赋值。 以下面的简历类为例,想要多份一模一样的简历就需要实例化多个Resume对象,并分别设置相同的...

代理模式

《大话设计模式》第7读书笔记,介绍代理模式

代理模式 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。 public interface Subject { public void request(); } RealSubject类,定义Proxy所代表的真实实...

Java多线程——线程池ThreadPoolExecutor源码解析

分析线程池ThreadPoolExecutor类的实现原理

对于线程的使用其实是需要严格控制的,CPU的一个核同一时间内只能有一个线程获得真正的运行时间,线程的创建和启动本身就存在不小的开销,并且它们会保存在内存中消耗空间,同时,过多的等待线程之间会存在竞争又消耗资源,并且线程间的上下文切换也有额外的消耗。因此,多线程原本是为了在CPU密集度低的任务存在时更好的压榨CPU资源,如果出现过多的等待线程反而降低性能,得不偿失。 为了解决这种每有一个新的...

装饰模式

《大话设计模式》第6章内容,介绍装饰模式

装饰模式(Decorator) 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。它的机构和具体代码如下 public interface Component { public void operation(); } public class ConcreteComponent implements Component { @Override ...

简单工厂模式与策略模式

《大话设计模式》第1、2章读书笔记,介绍简单工厂模式与策略模式

简单工厂模式 简单工厂模式想必大家都很熟悉了,它的目的是降低代码的耦合性,提高封装性与复用性。简单工厂模式可以很好的实现面向对象语言的多态性,可以想象现在有一个工厂,使用者告诉它我需要什么样的产品,工厂会根据要求新建出一个符合要求的对象。 如果要扩展新的实现类,只需要添加新的实现类并添加工厂的判断条件即可,不需要修改原有的实现。 简单计算器 以下面这个例子为例:现在要实现一个简单的两...

单例模式的四种写法

介绍单例模式的饿汉式、懒汉式、内部静态类、枚举类四种写法

为什么要使用单例 众所周知,类实例化后对象存在在Java堆中。而面向对象有三大特性,分别是:封装、继承、多态。封装要求把客观事物封装成抽象的类,在一个设计良好的程序中,一些工具性质的功能应该被抽象到一个单独的工具类中,便于在程序中可以复用。但是,类的使用需要先经过实例化也就是new一个对象,如果一个类在多个不同的类中被使用,每处都实例化一个对象,会增加实例化和对象回收的开销。当然,Java...

Java多线程——FutureTask源码解析

分析多线程返回结果类Callable基于FutureTask类执行的实现原理

一个很常见的多线程案例是,我们安排主线程作为分配任务和汇总的一方,然后将计算工作切分为多个子任务,安排多个线程去计算,最后所有的计算结果由主线程进行汇总。比如,归并排序,字符频率的统计等等。 我们知道Runnable是不返回计算结果的,如果想利用多线程的话,只能存储到一个实例的内部变量里面进行交互,但存在一个问题,如何判断是否已经计算完成了。用Thread.join是一个方案,但是我们只能...

Java多线程——AtomicLong LongAdder源码解析

分析多线程原子操作数AtomicLong和LongAdder以及compareAndSwap无锁算法的实现原理

首先强调:Unsafe在JDK9开始被完全禁用了,所以不建议人为使用。 我们知道在多线程环境下,要使用一个线程安全的计数器,大家首先会想到AtomicLong(AtomicInteger),它的核心是利用volatile来修饰value使得对变量的修改对所有线程可见,同时使用Unsafe提供的多种基于底层硬件指令的配合进行compareAndSwap(CAS)操作,达到lock-free的...

Java多线程——AtomicLong LongAdder源码解析

分析多线程原子操作数AtomicLong和LongAdder以及compareAndSwap无锁算法的实现原理

首先强调:Unsafe在JDK9开始被完全禁用了,所以不建议人为使用。 我们知道在多线程环境下,要使用一个线程安全的计数器,大家首先会想到AtomicLong(AtomicInteger),它的核心是利用volatile来修饰value使得对变量的修改对所有线程可见,同时使用Unsafe提供的多种基于底层硬件指令的配合进行compareAndSwap(CAS)操作,达到lock-free的...