单例设计模式下,饿汉式和懒汉式的区别

单例设计模式:

单例设计模式可以保证在一个JVM进程中某一个类只会存在有唯一的一个对象实例,从而保证一些核心对象的唯一性。单例设计模式中又分为饿汉式单例与懒汉式单例。

两种模式的区别:

懒汉式单例 不提前创建对象,是在你真正用到的时候才去创建这个单例对象,每次返回对象前进行对象是否实例化的判断,有则直接返回,负责进行实例化,需要考虑线程同步问题。
饿汉式单例 不管三七二十一,在类创建的同时创建好一个静态的单例对象,供使用者使用,饿汉式是线程安全的,不存在有线程同步的处理问题。
共同点

构造方法私有;

指向自身的引用静态私有;

对外提供静态的、返回值为自身实例的公有的方法。

懒汉式单例实现如下:

package Singleton;

/**
 * 懒汉式单例
 * jdk1.8
 */
class Singleton1 { 								// 单例设计类
    // 使用volatile避免了数据副本数据的拷贝与写入处理,可以更快的实现与原始内存数据的同步
    private static volatile Singleton1 instance=null; 	// 懒汉式

    private Singleton1() { 		// 构造方法私有化
        System.out.println("实例化Singleton1类的对象。");
    }
    public String toString() {
        return "singleton1";
    }

    // 不要在该方法中直接使用synchronized,否则会出现若干线程同步调用所造成的性能瓶颈
    public static Singleton1 getInstance() { 	// 获取Singleton类实例化对象
        if (instance == null) { 		// 对象未实例化
            // 同步处理主要是保护对象实例化的过程只允许有一个线程参与
            synchronized (Singleton1.class) { 	// 同步代码块
                if (instance == null) { 	// 对象未实例化
                    instance = new Singleton1();// 对象实例化
                }
            }
        }
        return instance;// 获取对象实例
    }
}


// 测试
public class TestDemo1 {
    public static void main(String[] args) throws Exception {
        for (int x = 0; x < 10; x++) {
            int finalX = x;
            new Thread(() -> {
                Singleton1 singleton = Singleton1.getInstance();    // 获取实例化对象
                System.out.println(singleton.toString()+ "--"+finalX +"的地址值为:"+singleton.hashCode());
            }).start();
        }
    }
}

饿汉式单例实现如下:

package Singleton;

/**
 * 饿汉式单例
 * jdk1.8
 */
public class Singleton2 {
    private static volatile Singleton2 instance=new Singleton2(); 	// 饿汉式

    private Singleton2() {
        System.out.println("实例化Singleton2类对象");
    }

    public String toString(){
        return "singleton2";
    }

    public static Singleton2 getInstance() {
        return instance; //直接返回单例对象
    }
}

//测试
public class TestDemo2 {
    public static void main(String[] args) throws Exception {
        for (int x = 0; x < 10; x++) {
            int finalX = x;
            new Thread(() -> {
                Singleton2 singleton = Singleton2.getInstance();    // 获取实例化对象
                System.out.println(singleton.toString()+ "--"+finalX +"的地址值为:"+singleton.hashCode());
            }).start();
        }
    }
}

总结:

单例模式可以避免一个全局使用的类频繁地创建与销毁,减少冗余的实例对象,节省系统资源。

归根结底,饿汉式设计模式和懒汉式设计模式的区别在于何时创建自身的单例对象。饿汉式单例只在类初始化时创建单例对象;懒汉式单例不提前创建单例对象,而是在需要用到的时候再进行实例化判断和创建。

你可能感兴趣的:(设计模式,java,开发语言)