通俗易懂的手写单例模式
这个是面试的时候经常会问到的,顺便让你手写一个单例模式 单例模式:一个类只创建一个实例,并且系统都使用这一个实例。 常用的单例模式有两种: 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; } }
上一篇:
IDEA上Java项目控制台中文乱码