java单例设计模式的三种写法

单例设计模式:保证类在内存中只有一个对象。

一、如何保证类在内存中只有一个对象呢?

  1. 控制类的创建,不让其他类来创建本类的对象。private
  2. 在本类中定义一个本类的对象。Singleton s;
  3. 提供公共的访问方式。Public static Singleton getInstance(){return s}

二、单例写法三种:

(1)    饿汉式开发推荐使用这种方式。上来就创建对象

/**
 * 饿汉式
 */
public class Singleton {
    // 1.私有构造方法,其它类不能访问该构造方法
    private Singleton() {}

    // 2.创建本类对象,且让它私有,目的是不让其修改该对象
    private static Singleton s = new Singleton();

    // 3.对外提供公共的访问方法 获取实例
    public static Singleton getInstance() {
        return s;
    }
}

(2)    懒汉式 面试写这种方式。但是多线程有线程隐患

/**
 * 懒汉式(单例的延迟加载模式),对于线程问题不好多线程时会有安全隐患
 *  所以开发的时候不用,面试的时候才用的
 */
public class Singleton {
    // 1.私有构造方法,其它类不能访问该构造方法
    private Singleton() {}
    // 2.声明一个对象的引用不去创建对象
    private static Singleton s;
    // 3.对外提供公共的访问方法 获取实例
    public static Singleton getInstance() {
        if(s==null){//如果s没创建对象
            //如果此处线程等待   线程1等待   线程2等待   线程1唤醒  返回一个s的实例对象
            //线程2唤醒返回一个s的实例对象   这样s就不是单例设计模式了
            s = new Singleton();
        }
        return s;
    }
}

(3)其它写法

public class Singleton{
    //1.私有构造方法,其他类不能访问该构造方法了
    private Singleton(){}
    //2.声明一个成员变量且实例化对象    final的目的是不让其改变只
    public static final Singleton s = new Singleton();
}

三、总结懒汉式和饿汉式的区别

  •   饿汉式是空间换时间,懒汉式是时间换空间  因为需要判断
  •   在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能创建多个对象
posted @ 2017-09-20 00:32  小富贵  阅读(233)  评论(0)    收藏  举报