单例模式有两种实现模式:饿汉模式和懒汉模式
饿汉模式
第一步:创建类的唯一实例,并且用private static修饰
第二步:把构造方法私有化,防止外界直接用new创建实例
第三步:提供一个用public static修饰的getIntence()方法,来获取这个唯一的实例
下面举一个例子
懒汉模式
第一步:声明类的的一个对象,并且用private static修饰
第二步:把构造方法私有化,防止外界直接用new创建实例
第三步:提供一个用public static修饰的getIntence()方法,来获取这个唯一的实例
注意:上图所示的代码在在单线程中能够正确执行,但是在多线程应用中具有线程安全问题。
我们可以使用synchronized的同步机制来解决懒汉模式的线程安全问题,如下图所示
这样子在多个线程并发执行的时候,同一时间只有一个线程来执行getIntence()这段代码,就不会出现线程安全问题。
但是这种方法效率比较低,在多线程并发访问getIntence()的时候,每次都要判断是否下了锁,比较浪费资源,为了提高效率,
可以采用双重判断的方法,如下图所示:
注意:同步代码块用的锁是单例的字节码文件对象Singleton.class,且只能用这个锁。
比较两种实现模式,饿汉模式在加载类的时候就创建了类的实例,比较费空间,但运行的时候比较快,且它是线程安全的;
而懒汉模式,则是在运行的时候创建类的实例,运行时比较慢,且它具有线程安全问题,实现起来稍微麻烦些,在实际开发中,
要根据实际情况合理选择这两种实现模式。