🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
单例模式(Singleton):是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。好处主要有:1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 单例模式主要有两种实现方式:1、懒汉式;2、饿汉式 ##一、uml建模 ![](https://box.kancloud.cn/2016-02-19_56c7196d64b8f.jpg) ##二、代码实现: ###1、懒汉式 ~~~ /** * 示例:单例--单例对象能保证在一个JVM中,该对象只有一个实例存在。 * * 缺点:这种做法在多线程环境下,不安全 * * 懒汉式 */ class Singleton { /** * 持有私有静态变量(也称类变量),防止被引用 * * 此处赋值为null,目的是实现延迟加载 (因为有些类比较庞大,所以延迟加载有助于提升性能) */ private static Singleton instance = null; /**私有构造方法,防止被实例化 */ private Singleton() { } /**静态工厂方法,创建实例 --只不过这里是创建自己,而且只能创建一个 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void info() { System.out.println("this is a test method..."); } } /** * 客户端测试类 * * @author Leo */ public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); /** * 调用普通方法 */ s1.info(); Singleton s2 = Singleton.getInstance(); /** * 运行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象 */ System.out.println(s1 == s2); } } ~~~ ### 2、饿汉式 ~~~ /** * 饿汉式 */ class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } public void info() { System.out.println("this is a test method..."); } } /** * 客户端测试类 * * @author Leo */ public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); /** * 调用普通方法 */ s1.info(); Singleton s2 = Singleton.getInstance(); /** * 运行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象 */ System.out.println(s1 == s2); } } ~~~ ### 3、如果考虑多线程,那么getInstance()方法要加同步synchronized,这时饿汉式比懒汉式要好,尽管资源利用率要差,但是不用同步。 ~~~ /** * * 考虑多线程的时候,下面这种做法可以参考一下:--懒汉式 * * 在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字 * * 这种做法考虑性能的话,整个程序只需创建一次实例,所以性能也不会有什么影响。 * * @author Leo */ public class SingletonTest { private static SingletonTest instance = null; private SingletonTest() { } private static synchronized void syncInit() { if (instance == null) { instance = new SingletonTest(); } } public static SingletonTest getInstance() { if (instance == null) { syncInit(); } return instance; } } ~~~ ##三、总结 单例模式保证了一个类只有一个实例,且提供一个访问全局点的方式,更加灵活的保证了实例的创建和访问约束。系统中只有一个实例,因此构造方法应该为私有饿汉式:类加载时直接创建静态实例;懒汉式:第一次需要时才创建一个实例,那么getInstance方法要加同步 饿汉式比懒汉式要好,尽管资源利用率要差,但是不用同步。