单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例。
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
package 单例模式; import java.util.HashMap; import java.util.Map; //1.懒汉式单例类,调用getInstance()则实例化,不调用不实例化 public class Singleton { /** * Singleton通过将构造方法限定为private避免了类在外部被实例化, * 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。 */ private Singleton(){} private static Singleton single=null; //确保线程安全的写法 //(1)在getInstance方法上加同步 public static synchronized Singleton getInstance(){ if(single==null){ single=new Singleton(); } return single; } //(2)双重检查锁定 public static Singleton getInstance2(){ if(single==null){ synchronized(Singleton.class){ if(single==null){ single=new Singleton(); } } } return single; } } //(3)静态内部类[既实现了线程安全,又避免了同步带来的性能影响] class SingletonStatic{ private static class LazyHolder{ private static final SingletonStatic INSTANCE=new SingletonStatic(); } private SingletonStatic(){} public static final SingletonStatic getInstance(){ return LazyHolder.INSTANCE; } } /** * 2.饿汉式单例类,在类初始化时,已经自行实例化 * 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用, * 以后不再改变,所以天生是线程安全的。 */ class Singleton2{ private Singleton2(){} private static final Singleton2 single=new Singleton2(); //静态工厂方法 public static Singleton2 getInstance(){ return single; } } ---------------------------------------------- package 单例模式; /* * 测试类 */ public class Test { public static void main(String[] args) { // Singleton3 single3=Singleton3.getInstance(null); // System.out.println(single3.about()); Singleton s1=Singleton.getInstance(); Singleton s2=Singleton.getInstance(); System.out.println(s1); System.out.println(s2); } }
执行测试类,控制台打印如下:
单例模式.Singleton@1db9742 单例模式.Singleton@1db9742