public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模式,我们首先必须将类在一个虚拟机中只能产生一个对象,因此应该做到以下几步: * a:私有化构造方法,这样在该类的外边就不能用new操作来创建对象,但是在类的内部可以创建该类的对象。 * b:调用该类的某个静态方法以返回内部创建的对象,因为该类的外部不发得到创建的对象,引用用静态的方法来返回。 * * * 饿汉模式:在类加载时就完成了初始化,但是加载比较慢,获取对象比较快。 * 饿汉模式是线程安全的,在类创建好一个静态对象提供给系统使用, * 懒汉模式:在类加载的时候不被初始化。延时加载 * 懒汉模式在创建对象时不加上synchronized,会导致对象的访问不是线程安全的(多线程) */ Single s1 = Single.getInstance(); Single s2 = Single.getInstance(); System.out.println(s1 == s2); //true 两者内存地址一样 指向同一个对象 Single2 s3 = Single2.getInstance(); Single2 s4 = Single2.getInstance(); System.out.println(s3 == s4); //true 两者内存地址一样 指向同一个对象 } } /** * 单例设计模式 饿汉式(常用) */ class Single { private static final Single s = new Single(); private Single() { } public static Single getInstance() { return s; } } /** * 单例设计模式 懒汉式(面试) */ class Single2 { private static Single2 s = null; private Single2() { } public static Single2 getInstance() { /** * 懒汉式使用双重验证锁解决多线程的线程安全问题,饿汉式不存在线程安全 */ if (s == null) { synchronized (Single2.class) { if (s == null) { s = new Single2(); } } } return s; } }