乐趣区

关于java:单例模式

  1. 懒汉模式
/**
 * @Description 懒汉模式 实现了提早加载, 然而效率较低
 * @Author wanghognbo
 * @Date 2021/9/1
 */
public class LazySingleton {

    private static LazySingleton lazySingleton;

    private LazySingleton(){}

    public synchronized static LazySingleton getLazySingleton(){if(lazySingleton == null){lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }

    public static void main(String[] args) {LazySingleton h1 = LazySingleton.getLazySingleton();
        LazySingleton h2 = LazySingleton.getLazySingleton();
        System.out.println(h1==h2);
    }
}
  1. 饿汉模式
1
/**
 * @Description  饿汉模式
 * 类加载时实现实例化, 防止多线程同步问题
 * 使类加载的状况有多种, 所以可能造成空间节约
 */
public class HungrySingleton {private static HungrySingleton singleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getSingleton(){return singleton;}

    public static void main(String[] args) {HungrySingleton h1 = HungrySingleton.getSingleton();
        HungrySingleton h2 = HungrySingleton.getSingleton();
        System.out.println(h1==h2);
    }
}
  1. 双重校验锁模式
/***
* @description: 1. 懒加载, 2 volatile 保障了指令不会重排
*/
public class DoubleCheckSingleton {

    private volatile static DoubleCheckSingleton singleton;

    private DoubleCheckSingleton() {}

    public static DoubleCheckSingleton getInstance(){if(singleton == null){synchronized (DoubleCheckSingleton.class){if(singleton == null){singleton = new DoubleCheckSingleton();
                }
            }
        }
        return singleton;
    }

    public static void main(String[] args) {DoubleCheckSingleton d1 = DoubleCheckSingleton.getInstance();
       DoubleCheckSingleton d2 = DoubleCheckSingleton.getInstance();
        System.out.println(d1==d2);
    }

}
  1. 外部类模式
/***
* @description: 外部类加载时不会加载外部类, 应用外部类时才会加载, 保障了懒加载
 * 类加载时实例化对象, 不会造成线程平安问题
*/
public class InnerClassSingleton {private InnerClassSingleton(){ }

    private static class innerInstance {private static final InnerClassSingleton singleton = new InnerClassSingleton();
    }

    public static InnerClassSingleton getInstance(){return innerInstance.singleton;}

    public static void main(String[] args) {InnerClassSingleton i1 = InnerClassSingleton.getInstance();
        InnerClassSingleton i2 = InnerClassSingleton.getInstance();
        System.out.println(i1==i2);
    }

}
退出移动版