认识设计模式(一)---单例模式(3)

(一)懒汉式(线程不安全)

(1)步骤如下:

  1. 构造器私有化(防止new再获取对象)
  2. 类的内部创建对象(但是不急着实例化)
  3. 提供一个公有的静态方法,当使用到这个方法时,先判断对象是不是null,如果为null再去实例化对象instance(饿汉式是调用类就创建对象并且实例化,懒汉式是调用类时创建对象,调用getInstance时对象实例化)

(2)单例类代码如下:

class Singleton03{
    //1-构造器私有化
    private Singleton03(){ }
    //2-本类内部创建对象实例
    private static Singleton03 instance;
    //3-提供一个公有的静态方法,当使用到这个方法时,才去创建instance
    //懒汉式
    public static Singleton03 getInstance(){
        if(instance==null){
            instance=new Singleton03();
        }
        return instance;
    }
}

(3)测试类代码如下

public class SingletonTest03 {
    public static void main(String[] args) {
        Singleton03 instance01=Singleton03.getInstance();
        Singleton03 instance02=Singleton03.getInstance();
        System.out.println(instance01==instance02);
        System.out.println("instance01-hashCode="+instance01.hashCode());
        System.out.println("instance02-hashCode="+instance02.hashCode());
    }
}

(二)优缺点分析

  1. 起到了懒加载的效果(调用类的时候只创建对象但是不急着实例化),但是只能在单线程下使用
  2. 如果在多线程下,一个线程进入了if语句,还没来得及往下执行,另一个线程也通过这个if语句,这样就会产生多个实例
  3. 所以说:在实际开发中,不要使用这种方式

(三)与饿汉式的区别

//创建对象,对象实例化,这两步在调用类的时候都会完成
private final static Singleton01 instance=new Singleton01();

改成了

//调用类的时候创建对象,如果你不调用getInstance方法就不会实例化,也就不会占用内存
//什么时候调用getInstance什么时候才实例化对象,才会占用内存
    private static Singleton03 instance;
    public static Singleton03 getInstance(){
        if(instance==null){
            instance=new Singleton03();
        }
        return instance;
    }
发布了41 篇原创文章 · 获赞 5 · 访问量 678

猜你喜欢

转载自blog.csdn.net/weixin_44823875/article/details/104785502