单例模式--饿汉模式和懒汉模式

一、所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例

具体代码的实现:

1、饿汉模式(提前创建对象)

// 饿汉模式
class Bank{
    //提供私有的构造器
    private Bank(){
    }
    //内部创建类的对象
    //此对象也必须创建为静态的
    private static Bank Instance = new Bank();

    //提供公共的静态方法,返回类的对象
    public static Bank getInstance(){
        return Instance;
    }
}

2.懒汉模式(延迟创建对象)

//懒汉模式
class Bank1{
    //提供私有的构造器
    private Bank1(){
    }
    //声明一个没有初始化的当前类对象
    //此对象也必须创建为静态的
    private static Bank1 Instance= null;

    //创建一个返回当前类对象的公共静态方法
    public static Bank1 getInstance(){
        if (Instance == null){
Instance
= new Bank1(); } return Instance; } }

两种方式的对比:
* 饿汉式:
* 坏处:对象加载时间过长。
* 好处:饿汉式是线程安全
*
* 懒汉式:好处:延迟对象的创建。
* 目前的写法坏处:线程不安全。--->到多线程内容时,再修改

创建方式上的相同与不同:

相同点:两者都需要创建私有的构造器,声明私有静态类的对象,创建返回当前类对象的公共静态方法

不同点:1、饿汉模式在声明私有静态类的对象时对对象进行实例化

    //内部创建类的对象
    //此对象也必须创建为静态的
    private static Bank Instance = new Bank();

    懒汉模式在声明私有静态类的对象时不进行实例化

   //声明一个没有初始化的当前类对象
    //此对象也必须创建为静态的
    private static Bank1 Instance= null;

  2、饿汉模式:调用公共的静态方法,返回类的对象

 //提供公共的静态方法,返回类的对象
    public static Bank getInstance(){
        return Instance;
    }

    懒汉模式:调用公共的静态方法时需要判断对象名是否为空,若‘真’则对对象进行实例化,‘否’则返回已经创建过的对象。

//创建一个返回当前类对象的公共静态方法
    public static Bank1 getInstance(){
        if (Instance == null){
            Instance = new Bank1();
        }
        return Instance;
    }

 使用同步机制将单例模式中的懒汉式改写为线程安全的。

方式一:每个线程进来时都需要等待前一个线程执行完毕才能进入判断,若已被实例化则之后的线程等待的时间是无意义的,增加了消耗时间。

方式二:在加入synchronized同步代码块之前先判断一遍对象是否实例化,若已被实例化则不需要等待获取锁,直接获取对象。减少消耗时间提高效率。

class Bank{

    private Bank(){}

    private static Bank instance = null;

    public static Bank getInstance(){
        //方式一:效率稍差
//        synchronized (Bank.class) {
//            if(instance == null){
//
//                instance = new Bank();
//            }
//            return instance;
//        }
        //方式二:效率更高
        if(instance == null){

            synchronized (Bank.class) {
                if(instance == null){

                    instance = new Bank();
                }

            }
        }
        return instance;
    }

}

 

原文地址:https://www.cnblogs.com/lixia0604/p/13441659.html