Java单例模式
Java单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
解决:一个全局使用的类频繁地创建与销毁。
使用:当您想控制实例数目,节省系统资源的时候。
解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键:构造函数是私有的。
优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
代码示例
1、懒汉模式
/** * 懒汉式:线程不安全 * @author 943567518@qq.com * */ public class SingletonA1 { /* * 私有静态变量 */ private static SingletonA1 instance; /** * 空构造方法 */ private SingletonA1(){} /** * 获取实例 * @return */ public static SingletonA1 getInstance(){ if(instance==null){ instance=new SingletonA1(); } return instance; } }
/** * 懒汉式:线程安全 * @author 943567518@qq.com * */ public class SingletonA2 { /* * 私有静态变量 */ private static SingletonA2 instance; /** * 空构造方法 */ private SingletonA2(){} /** * 获取实例-加锁 * @return */ public static synchronized SingletonA2 getInstance(){ if(instance==null){ instance=new SingletonA2(); } return instance; } }
2、饿汉模式
/** * 饿汉式:线程安全 * @author 943567518@qq.com * */ public class SingletonB { /* * 私有静态变量 */ private static SingletonB instance=new SingletonB(); /** * 空构造方法 */ private SingletonB(){} /** * 获取实例 * @return */ public static SingletonB getInstance(){ return instance; } }
3、双重检验
/** * 双重检验:线程安全 * @author 943567518@qq.com * */ public class SingletonC { /* * 私有静态变量 */ private static volatile SingletonC instance; /** * 空构造方法 */ private SingletonC(){} /** * 获取实例 * @return */ public static SingletonC getInstance(){ if(instance==null){ synchronized(SingletonC.class){ if(instance==null){ instance=new SingletonC(); } } } return instance; } }
4、静态内部类
/** * 静态内部类:线程安全 * @author 943567518@qq.com * */ public class SingletonD { private SingletonD(){} public static SingletonD getInstance(){ return SingletonInner.INSTANCE; } /** * 内部类 * @author Administrator * */ private static class SingletonInner{ private static final SingletonD INSTANCE=new SingletonD(); } }