这个是面试的时候经常会问到的,顺便让你手写一个单例模式
单例模式:一个类只创建一个实例,并且系统都使用这一个实例。
常用的单例模式有两种:
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;
}
}