设计模式:java单例模式 懒汉&饿汉

单例模式的懒汉饿汉区别就是是否在程序一开始就创建单例

  • 懒汉:很懒,所以一开始不创建单例,等到需要用到的时候才创建单例,用时间换空间。

注意:懒汉单例是线程不安全的,如果有两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
所以我们需要使用synchronize关键字

//懒汉式单例模式  
public class MySingleton {  

    //设立静态变量  
    private static MySingleton mySingleton = null;  

    private MySingleton(){  
        //私有化构造函数  
        System.out.println("-->懒汉式单例模式开始调用构造函数");  
    }  

    //开放一个公有方法,判断是否已经存在实例,有返回,没有新建一个在返回  
    public static MySingleton getInstance(){  
        System.out.println("-->懒汉式单例模式开始调用公有方法返回实例");  
        if(mySingleton == null){  
            System.out.println("-->懒汉式构造函数的实例当前并没有被创建");  
            mySingleton = new MySingleton();  
        }else{  
            System.out.println("-->懒汉式构造函数的实例已经被创建");  
        }  
        System.out.println("-->方法调用结束,返回单例");  
        return mySingleton;  
    }  
}  
  • 饿汉:不懒,一开始就创建单例,空间换时间。线程安全,不用synchronize关键字
/** 
 * 饿汉式单例模式 
 * MySingleton2 
 */  
public static void myprint2(){  
    System.out.println("-----------------饿汉式单例模式----------------");  
    System.out.println("第一次取得实例(饿汉式)");  
    MySingleton2 s1 = MySingleton2.getInstance();  
    System.out.println("第二次取得实例(饿汉式)");  
    MySingleton2 s2 = MySingleton2.getInstance();  
    if(s1==s2){  
        System.out.println(">>>>>s1,s2为同一实例(饿汉式)<<<<<");  
    }  
    System.out.println();  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值