通俗易懂的手写单例模式

这个是面试的时候经常会问到的,顺便让你手写一个单例模式
单例模式:一个类只创建一个实例,并且系统都使用这一个实例。
常用的单例模式有两种:
1 饿汉式的

// 饿汉式: 提前实例好一个对象,你要用,我就返回给你
//但是有个问题,因为是提前写好的,可能会浪费空间,因为你占用了空间,但是可能没有起作用。
public class Hungry {

    //不使用就浪费
    private byte[] data1 =new byte[1024*1024];
    private byte[] data2 =new byte[1024*1024];
    private byte[] data3 =new byte[1024*1024];
    //构造器必须私有化
    private  Hungry(){

    }
    //直接写好
    private final  static  Hungry HUNGRY=new Hungry();
    public static  Hungry getInstance(){
    //直接返回
        return  HUNGRY;
    }
}

懒汉式的:懒汉式就是要调方法的时候再创建,这里还要注意多线程和指令重排的问题

//懒汉式
public class LazyMan {
  private  LazyMan(){
        System.out.println();
    }
    //volatile 可以解决指令重排
    private volatile static  LazyMan lazyMan;
    public  static LazyMan getInstance(){
        //双重检测模式解决多线程问题 dcl懒汉式
        if(lazyMan==null){
        // synchronized 锁着类对象,同一时间只能有一个线程进入
            synchronized (LazyMan.class){
                if(lazyMan==null){
                    lazyMan =new LazyMan();//不是原子性操作
                    //1先分配内存空间
                    //2执行构造方法,初始化对象
                    //3把这个对象指向这个空间
                    //如果发生指令重排
  // 如果a线程先执行13 还没有执行2 b线程进来判断lazyman不为空,直接返回了一个没有初始化的对象
                }
            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值