单例模式简单讲解

什么是单例模式

  • 单例模式:是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

单例模式的类型

单例模式有两种类型:

  • 懒汉式:在真正需要使用对象时才去创建该单例类对象
  • 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用

饿汉式

package single;

public class Hungry {
    //构造器私有
    private Hungry(){

    }
    //创建对象
    private static Hungry hungry=new Hungry();
    //创建方法
    private static Hungry getInstance(){

//        返回对象
        return hungry;
    }

}

懒汉式


public class LazyMan {

    //构造器私有
    private LazyMan(){

    }
//    懒汉式先判断是要执行方法,执行在创建对象
    private static LazyMan lazyMan;

    private static LazyMan getInstance(){

        if (lazyMan==null){
            lazyMan=new LazyMan();
        }
        return lazyMan;

    }

}

但在多条线程执行下就会出现问题

package single;

public class LazyMan {

    //构造器私有
    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"-->");

    }
//    懒汉式先判断是要执行方法,执行在创建对象
    private static LazyMan lazyMan;

    public static LazyMan getInstance(){
        if (lazyMan==null){
            lazyMan=new LazyMan();
        }
        return lazyMan;

    }



    public static void main(String[] args) {
        for (int i = 0; i <10 ; i++) {
            new Thread(
                    ()->{
                        LazyMan.getInstance();
                    }
            ).start();

        }
    }


}

会有多个线程进入,所以我们就要加锁
也就出现了DCL懒汉式

package single;

public class LazyMan {

    //构造器私有
    private LazyMan() {
        System.out.println(Thread.currentThread().getName() + "-->");

    }

    //    懒汉式先判断是要执行方法,执行在创建对象
    private static LazyMan lazyMan;

    public static LazyMan getInstance() {
//        加锁当lzayMan==null时加锁,这是就称为双重检测锁模式(简称DCL懒汉式)
        if (lazyMan == null) {
            synchronized (LazyMan.class) {
                if (lazyMan == null) {
                    lazyMan = new LazyMan();
                }


            }

        }
        return lazyMan;
    }


    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(
                    () -> {
                        LazyMan.getInstance();
                    }
            ).start();

        }
    }


}

注意:

但是加锁之后,还会问题就是利用反射破解单例模式
这是就需要用到枚举了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值