Java模式理解阶段一:单例模式

Java的设计模式总体分为三大类

创建型模式
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

一、单例模式

单例模式分为懒汉式和饿汉式

饿汉式:
在声明对象时就初始化,饿汉式天生线程安全,类加载的时候初始化一次对象,效率比懒汉式要高。

public class SingleTon {
    //定义私有构造方法
    private SingleTon(){
    }

    //饿汉式  类加载的时候就进行初始化
    private static final  SingleTon single = new SingleTon();

    public static SingleTon getInstance(){
        return single;
    }
}

懒汉式:
在静态方法中进行初始化,懒汉式线程不安全,需要加同步锁,同步锁影响执行效率

public class SingleTon {
	//定义私有构造方法
    private SingleTon2(){


    }
    //懒汉式  双重校验保证线程安全  使用volatile可以保证指令重排序
    private volatile static SingleTon singleTon = null;


    public static SingleTon getInstance(){
        if (singleTon==null){
            synchronized (SingleTon.class){
                if (singleTon==null){
                    singleTon = new SingleTon();
                }
            }
        }
        return singleTon;
    }
}

对于单例模式的理解

  • 在单例模式中单例类只能有一个实例,其中单例模式中的构造方法必须为私有,目的是防止外部去创建。
  • 既然不是通过外部去实例化,那么只能在本类中创建对象,并且必须设计为私有的。
  • 但是如果外部类要去访问这个实例对象,在本类中必须有一个方法可以供外部访问。
  • 单例类可以设计为final,目的在于不能被子类继承。

单例模式的饿汉式:

  • 对于饿汉式式来说是不存在多线程的问题,这也是单例模式的优点。
  • 但是对于饿汉式式来说,在类加载的时候静态代码就会被初始化,因此在类加载时就会创建实例对象,并且分配内存空间,不管这个对象要不要使用都会占据内存空间。

单例模式的懒汉式:

  • 对于懒汉式,在类加载的时候虽然也会创建对象,但是将对象设为null,因此并不会占用内存,当调用getInstance方法时才会被初始化实例对象。
  • 但是这样的方式也会存在多线程问题,因此通过使用volatile以及synchronized关键加锁来解决懒汉式多线程问题。

以上就是对单例模式的总结以及理解,欢迎指正交流。 刚入行的小白希望多指正。

发布了55 篇原创文章 · 获赞 6 · 访问量 3977

猜你喜欢

转载自blog.csdn.net/qq_40126996/article/details/100729799