通俗易懂的手写单例模式

这个是面试的时候经常会问到的,顺便让你手写一个单例模式 单例模式:一个类只创建一个实例,并且系统都使用这一个实例。 常用的单例模式有两种: 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;
    }
}
经验分享 程序员 微信小程序 职场和发展