一、单例实现方式
- 饿汉式
- 懒汉式
- 懒汉式+Synchronized
- 双重校验
- 静态内部类
- 枚举(推荐方式)
二、实现代码
-
饿汉式
package com.hanko.designpattern.singleton;
/**
-
饿汉式 (饿怕了,担心没有吃,所以在使用之前就new出来) *优点:实现简单,安全可靠 *缺点:在不需要时,就已实例化了
-
@author hanko
-
@version 1.0
-
@date 2020/9/14 18:50 */ public class HungrySingleton { //特点一 静态私有变量 直接初始化 private static HungrySingleton instance = new HungrySingleton(); //特点二 构造函数私有 private HungrySingleton(){
} public static HungrySingleton getInstance(){ return instance; } public void doSomething(){ //具体需要实现的功能 } }
-
-
懒汉式
package com.hanko.designpattern.singleton;
/**
-
懒汉式(非常懒,所以在要使用时再去new) *优点:简单 *缺点:存在线程安全问题
-
@author hanko
-
@version 1.0
-
@date 2020/9/14 18:50 */ public class SluggardSingleton { //特点一 静态私有变量,先不初始化 private static SluggardSingleton instance; //特点二 构造函数私有 private SluggardSingleton(){
} //特点三 null判断,没有实例化就new public static SluggardSingleton getInstance(){ if(instance == null){ instance = new SluggardSingleton(); } return instance; } public void doSomething(){ //具体需要实现的功能 }
}
-
-
懒汉式+Synchronized
package com.hanko.designpattern.singleton;
/**
-
懒汉式(非常懒,所以在要使用时再去new) *优点:简单 *缺点:存在线程安全问题
-
@author hanko
-
@version 1.0
-
@date 2020/9/14 18:50 */ public class SluggardSingleton { //特点一 静态私有变量,先不初始化 private static SluggardSingleton instance; //特点二 构造函数私有 private SluggardSingleton(){
} //特点三 null判断,没有实例化就new public static synchronized SluggardSingleton getInstance(){ if(instance == null){ instance = new SluggardSingleton(); } return instance; } public void doSomething(){ //具体需要实现的功能 }
}
-
-
双重校验
package com.hanko.designpattern.singleton;
/**
-
双重校验 *对懒汉式单例模式做了线程安全处理增加锁机制
-
volatile变量级
-
synchronized 类级
-
@author hanko
-
@version 1.0
-
@date 2020/9/15 9:53 */ public class DoubleCheckSingleton { //特点一 静态私有变量,增加volatile变量级锁 private static volatile DoubleCheckSingleton instance; //特点二 构造函数私有 private DoubleCheckSingleton(){
} //特点三 双重null判断 synchronized类级锁 public static DoubleCheckSingleton getInstance(){ if (instance == null){ synchronized(DoubleCheckSingleton.class){ if (instance == null){ instance = new DoubleCheckSingleton(); } } } return instance; } }
-
-
静态内部类
package com.hanko.designpattern.singleton;
/**
-
内部静态类方式 *优点:静态内部类不会在InnerStaticSingleton类加载时加载,
-
而在调用getInstance()方法时才加载 *缺点:存在反射攻击或者反序列化攻击
-
@author hanko
-
@version 1.0
-
@date 2020/9/15 10:03 */ public class InnerStaticSingleton { //特点一:构造函数私有 private InnerStaticSingleton(){
} //特点二:静态内部类 private static class InnerSingleton{ private static InnerSingleton instance = new InnerSingleton(); }
public InnerSingleton getInstance(){ return InnerSingleton.instance; }
public void doSomething(){ //do Something } }
-
-
枚举(推荐方式)
package com.hanko.designpattern.singleton;
/**
- 枚举实现单例简单安全
- @author hanko
- @version 1.0
- @date 2020/9/14 19:01 */ public enum EnumSingleton { INS; private Singleton singleton; EnumSingleton() { singleton = new Singleton(); } public void doSomething(){ singleton... //具体需要实现的功能 }
}
EnumSingleton.INS.doSomething();
源代码
[hanko/design-pattern
gitee.com