设计单例设计模式按照创建的时间分为 饿(比较急迫使用)汉式、懒(比较懒需要的时候才创建)汉式
饿汉式常见的形式
- 直接实例化(比较简介直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
懒汉式常见的形式
- 线程不安全(适用单线程)
- 线程安全(适用多线程)
- 静态内部类形式(适用多线程)
①饿汉式 直接实例化 示例代码
public class Singleton1 {
public static final Singleton1 INSTANCE=new Singleton1();
private Singleton1(){
}
}
②枚举类型
public enum Singleton2 {
INSTANCE
}
③静态代码块
public class Singleton3 {
public static final Singleton3 INSTANCE;
static {
INSTANCE=new Singleton3();
}
private Singleton3(){
}
}
④懒汉式 线程不安全的形式(适用单线程程序)
public class Singleton4 {
public static Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
if (instance==null){
instance=new Singleton4();
}
return instance;
}
}
上面④的方式在多线程可能会造成线程安全问题,多个线程可能都进入到if中然后,都执行new实例化,导致产生不止一个示例对象。解决方法是加锁,保证只有一个线程能进入if中进行new实例化
⑤线程安全
public class Singleton5 {
public static Singleton5 instance;
private Singleton5() { }
public static Singleton5 getInstance() {
if (instance == null) {//提高效率加的判断
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
}
return instance;
}
}
⑥静态内部类
静态内部类的特点
- 在内部类加载和初始化时才创建INSTANCE实例对象
- 静态内部类不会自动随着外部类加载和初始化,jdk会单独去加载和初始化
public class Singleton6 {
private Singleton6(){ }
private static class InnerClass{
private static final Singleton6 INSTANCE=new Singleton6();
}
public static Singleton6 getInstance(){
return InnerClass.INSTANCE;
}
}