单例设计模式:就是无论我们如何创建对象,你得到的都是同一个对象。
思路:静态块在在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次。所以单例设计时,使用静态块来初始化一个本类对象以实现单例。
1.私有化构造方法
2.在当前类中定义一个本类类型的静态属性
3.编写静态块,对本类类型的静态属性实例化对象
4.编写一个静态的方法,向外界提供私有化的静态属性
方法:

public class Single {
    private static Single single;
    private Single(){}
 static{
        if(single==null)
        {
            single=new Single();
        }
 }
 public static Single getSingle(){
        return single;
 }
}

图片说明 此时可见,用构造方法已无法实例化对象,只能用静态方法实例化。
图片说明
通过上面可知,得到的对象是同一个
而且上面的方法是线程安全的,因为类变量和static块仅在类第一次加载执行一次。类加载之后,才会有实例化。所以可以理解为每一次类的实例化只有第一次实例化的时候,会导致类加载并执行static块,其它的都不会执行static块。所以static块中的操作是线程安全的,类加载的阶段还没有实例被创建,也就不存在实例的线程中修改类变量的情况存在。也不会存在jvm中相同的类加载多次。