单例模式
-
饿汉式单例
注意修饰符,一个不能少
class HungrySingleTon{ // privat static final 一个不能少.... private static final HungrySingleTon instance=new HungrySingleTon(); private HungrySingleTon() { } public static HungrySingleTon getInstance(){ return instance; } }
优点:在类加载的时候完成初始化,
不用考虑线程安全问题
缺点:即使没有调用单例,也占用了内存 -
懒汉式单例
-
双重检测锁(DCL)
注意其中volatile的作用
=> 禁止指令重排序(以及修改立即可见)
为什么这里要禁止重排序?防止T1完成instance的内存分配,但是尚未初始化时,T2检测到instance不是null而直接返回未初始化的对象class DCLLazySingleTon{ /** * - private:仅被此类访问 * - volatile:保证数据修改后理解可见;禁止指令重排序 * - static:仅属于此类的单例 */ private volatile static DCLLazySingleTon instance; // private 保证不被其他类调用 private DCLLazySingleTon(){ } public static DCLLazySingleTon getInstance(){ if(instance==null){ // 第一重检验 synchronized (DCLLazySingleTon.class){ if(instance==null){ // 第二重检验 instance=new DCLLazySingleTon(); } } } return instance; } }
-
静态内部类方式
class InnerLazySingleTon{ private InnerLazySingleTon(){ } public static InnerLazySingleTon getInstance(){ return LazyHolder.LAZY; } private static class LazyHolder{ private static final InnerLazySingleTon LAZY=new InnerLazySingleTon(); } }
模板方法模式
- 核心思想概述
父类中方法A调用它自己的方法B,但是方法B它自己并未实现,而是交给其子类实现;所以在子类中只需要实现可定制的方法B,而且可以直接使用方法A => B就是模板方法