常用的设计模式----单例模式

应用场景:

比如工具类,线程池,缓存,日志对象,配置文件。这些对象只需要一个就足够了,避免如果创造多个实例,引发其他问题(占用过多资源,不一致的结果等等)。


作用:

保证整个应用程序中某个实例有且只有一个。


类型1:饿汉式

实现步骤

    /**
     * 单例模式之-----饿汉模式
     * @author Administrator
     *
     */
    public class Singleton {

    // 1.重写默认的构造方法,将构造方法私有化不允许外部直接创建对象
    private Singleton() {
    };

    // 2.在类的内部,创建类的唯一的,私有的【静态】实例
    private static Singleton init = new Singleton();

    // 3.提供一个获取实例的公有【静态】方法
    public static Singleton getInit() {
        return init;
    }

    // 4.通过类名,直接调用获取实例的【静态】方法
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInit();
        Singleton s2 = Singleton.getInit();
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
    }
    }


类型2:懒汉式

实现步骤

     /**
     * 单例模式之----懒汉模式
     * 
     * @author Administrator
     * 
     */
    public class Singleton2 {

    //1.将构造方法私有化,不允许外边直接创建对象
    private Singleton2() {

    }

    //2.声明类的唯一实例,使用private  static 修饰
    private static Singleton2 init;

    //3.1-->线程【不安全】 提供一个获取实例的方法,使用 public static 修饰
    /*假设开始线程2进入,判断instance为空,在将要创建实例时,cpu切换,
线程1又进来了,同样instance为空 创建了实例,这是cpu切换回来到0线程,继续创建实例
可见,经过分析共创建了 两个实例,还谈什么单例。*/
    public static Singleton2 getInit() {
    //1线程
        if (init==null) {
        //2线程
             init =new Singleton2();
        }

        return init;
    }
//3.2-->【线程安全】 
/*假设0线程进来,instance为空,进入同步代码块,cpu切换,
线程1进来,instance为空,在同步代码块外,因为此时2正在里面
ok,cup切换,执行创建实例,当1在进入代码块后,此时instace不为空,直接返回instance
当在有线程进来instance不为空,不用执行同步代码块,效率提供了。*/
    public static Singleton2 getInit() {
        if (init==null) {
        //1线程
            Synchronized(Singleton2.class){
            //2线程
                if (init==null) {
                    init =new Singleton2();
                }
            }    
        }
        return init;
    }

    //4.通过类名,直接调用获取实例的【静态】方法
    public static void main(String[] args) {
        Singleton2 s3 = Singleton2.getInit();
        Singleton2 s4 = Singleton2.getInit();
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
    }

}

懒汉与饿汉的区别:

饿汉模式:加载类时比较慢,运行时获取对象的速度比较快,线程安全

懒汉模式:加载类时比较快,运行时获取对象的速度比较慢,线程不安全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值