设计模式之-单例模式
1、单例模式的应用场景:
(1)、方便资源相互通信的环境。比如:线程池
(2)、封装一些常用的工具类,保证整个应用常用的数据统一
(3)、保存一些共享数据在内存中,其他类随时可以读取。
2、单例模式实现的方式:
(1)、饿汉式:类装载时就会完成实例化
(2)、懒汉式:不使用的情况下不进行实例化,会按需初始化
(3)、静态内部类:加载外部类时不会加载内部类,这样实现懒加载(其实还是懒汉式的实现)
(4)、枚举类:使用枚举类实现单例模式(也是懒汉式的一种,并且是线程安全,并且可以反序列化)
3、各方式的实现代码:
(1)、饿汉式:
public class Mgr01 { private static final Mgr01 INSTANCE= new Mgr01(); private Mgr01() {}; private static Mgr01 getInstance(){ return INSTANCE; } public void m(){ System.out.println("m"); } } //调用时 Mgr01 m1=Mgr01.getInstance();
(2)、懒汉式:
/** * 使用volatile 和 synchronized 和双重检查解决线程安全问题 **/ public class Mgr03 { private volatile static Mgr03 INSTANCE; private void Mgr03(){}; private static Mgr03 getInstance(){ if(INSTANCE == null){ //锁优化 不是所有线程都加锁 synchronized (Mgr03.class) { //双重检查 if(INSTANCE == null) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } INSTANCE = new Mgr03(); } } } return INSTANCE; } public void m(){ System.out.println("m2");} } //调用时 Mgr03.getInstance();
(3)、静态内部类
//jvm保证单例,同时也是线程安全 public class Mgr04 { private Mgr04(){} private static class Mgr04Holder{ private static final Mgr04 INSTANCE= new Mgr04(); } public static Mgr04 getInstance(){ return Mgr04Holder.INSTANCE; } } //调用时 Mgr04.getInstance();
(4)、枚举类
public enum Mgr05 { INSTANCE; } //调用时 Mgr05.INSTANCE
——听设计模式之笔记