单例模式?学习懒汉式和饿汉式

单例模式

1.单例模式的懒汉式实现package com.shine.study.designpatterns.singletonpatterns;

 

package com.shine.study.designpatterns.singletonpatterns;

/**
 * @Author: Shine EtherealWind
 * @Description: 懒汉式
 * 1.定义全局可见的对象引用;
 * 2.私有化的构造函数(每个类都有隐式的无参构造函数,
 *   这里显示写了私有构造函数也是制止其他类里面使用new的方式构造出这个类的对象);
 * 3.获取单例对象的方法,使用synchronized保证在并发情况下是线程安全的;
 * @Date: create in 17:10 2022/2/24
 */
public class LazySingleton {
    //
    private static volatile LazySingleton instance = null;

    private LazySingleton(){ }

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

class TestMain{
    public static void main(String[] args) {
        LazySingleton lazySingleton1 = LazySingleton.getInstance();
        LazySingleton lazySingleton2 = LazySingleton.getInstance();
        /*
         * eqquals 方法表示两个对象的hashCode相同,且在同一个hashCode上的位置也相同;
         */
        System.out.println("懒汉式单例两次获取的对象是否相同?"+ lazySingleton1.equals(lazySingleton2));
    }
}

 

 

 

运行结果

 

 

 

2.单例模式的饿汉式实现

package com.shine.study.designpatterns.singletonpatterns;

import java.awt.*;

/**
 * @Author: Shine EtherealWind
 * @Description: 饿汉式
 * 1.定义对象的引用 instance 并且同时给定该单例引用的实例对象;(也可以将实例对象的写法改成静态代码块)
 * 2.私有化的构造函数(每个类都有隐式的无参构造函数,
 *   这里显示写了私有构造函数也是制止其他类里面使用new的方式构造出这个类的对象);
 * 3.获取单例对象的方法;  
 * @Date: create in 17:15 2022/2/24
 */
public class HungrySingleton {
    private static final HungrySingleton instance = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return instance;
    }
}


class TestMain2{
    public static void main(String[] args) {
       HungrySingleton hungrySingleton1 = HungrySingleton.getInstance();
       HungrySingleton hungrySingleton2 = HungrySingleton.getInstance();
    //equals 方法表示两个对象的hashCode相同,且在同一个hashCode上的位置也相同
       System.out.println("饿汉式单例两次获取的对象是否相同?"+ hungrySingleton1.equals(hungrySingleton2));
    }
}

运行结果

 

posted @ 2022-02-25 14:13  EtherealWind  阅读(29)  评论(0编辑  收藏  举报