java设计模式学习__单例模式

时间:2023-02-26 15:19:54
单例模式
 
概念理解:程序内只存在一个该对象。
 
分类:
1.饿汉模式:在程序启动时创建。只创建一次。线程安全。
2.懒汉模式:用到时再创建。只创建一次。线程不安全。
 
懒汉为什么线程不安全?
当多个线程同时执行获取单例对象的方法时(如下面代码:getLazySingle()),会出现创建多个单例对象的情况。
具体请可以参照:https://blog.csdn.net/luqiren/article/details/79065545
 
代码演示:
1.饿汉模式:
/*
 * 饿汉模式:程序一开始启动就创建
 */
public class HungerSingle {

    //构造私有:防止在本类外部创建对象
    private HungerSingle (){
        System.out.println("我是一名饥饿的痴汉,主动去勾搭!!!");
    }
    
    //内部创建当前对象
    private static HungerSingle instance = new HungerSingle();
    
    //外部获取当前单例对象的方法
    public static HungerSingle getHungerSingle(){
        return instance;
    }
}
=================================================================
2.懒汉模式
/*
 * 懒汉模式:用到我,我再去创建
 */
public class LazySingle {

    // 构造私有:防止在本类外部创建对象
    private LazySingle() {
        System.out.println("我是一名懒散的痴汉,等着被勾搭!!!");
    };

    // 这里只是被声明,并未创建对象
    private static LazySingle instance;

    //当该方法被“第一次”调用时创建单例对象,只是第一次调用时创建
    public static LazySingle getLazySingle() {
        //第一次调用,创建对象
        if(instance == null){
            instance = new LazySingle();
        }
        return instance;
    }

}
=================================================================
3.测试
public class SingleTest {

    public static void main(String[] args) {
        // 饿汉单例测试
        /*HungerSingle single01 = HungerSingle.getHungerSingle();
        HungerSingle single02 = HungerSingle.getHungerSingle();
        if (single01 == single02) {
            System.out.println("同一个痴汉!!!");
        }else {
            System.out.println("两个痴汉!!!");
        }*/
        
        //懒汉测试
        LazySingle single01 = LazySingle.getLazySingle();
        LazySingle single02 = LazySingle.getLazySingle();
        if (single01 == single02) {
            System.out.println("同一个痴汉!!!");
        }else {
            System.out.println("两个痴汉!!!");
        }
    }

}
=================================================================