设计模式(Design Patterns)
单例模式(singleton)
饿汉式:类加载后初始化一个实例
/**
* 饿汉式
* 缺点:用不用这个对象都会被实例。
* <p>
* 单例模式
*/
public class Mgr01 {
/**
* 类加载到内存,就实例化一个单例,JVM保证线程安全
*/
private static final Mgr01 instance = new Mgr01();
/**
* 将构造方法私有,使别人无法通过new来使用这个类,只能用getInstance()方法。
*/
private Mgr01() {
}
public static Mgr01 getInstance() {
return instance;
}
}
懒汉式:用到时在加载
/**
* lazy loading
* 懒汉式
* 缺点:存在线程安全问题
* 可以加synchronized来解决线程安全问题,但是会影响效率。
*/
public class Mgr02 {
private static Mgr02 INSTANCE;
private Mgr02() {
}
/**
* 不安全
* @return
*/
// public static Mgr02 getInstance() {
// if (INSTANCE == null) {
// INSTANCE = new Mgr02();
// }
// return INSTANCE;
// }
/**
* 安全,效率低
*
* @return
*/
// public static synchronized Mgr02 getInstance() {
// if (INSTANCE == null) {
// INSTANCE = new Mgr02();
// }
// return INSTANCE;
// }
/**
* 安全,效率较高
*
* @return
*/
public static Mgr02 getInstance() {
if (INSTANCE == null) {
synchronized (Mgr02.class){
if(INSTANCE == null){
INSTANCE = new Mgr02();
}
}
}
return INSTANCE;
}
}
静态内部类的方式实现单例模式
public class Mgr03 {
private Mgr03() {
}
/**
* jvm虚拟机加载Class文件保证只加载一次。
*/
private static class Mgr03Holder {
private static final Mgr03 INSTANCE = new Mgr03();
}
public static Mgr03 getInstance() {
return Mgr03Holder.INSTANCE;
}
}
最完美的单例模式,枚举单例
/**
* 不仅解决线程安全问题,还防止反序列化
* 枚举类没有构造方法
*/
public enum Mgr04 {
INSTANCE;
}
本文是看完马士兵老师的视频后做的笔记。