分为两种:
1.懒汉模式;2.饿汉模式;双重锁定饿汉模式。
饿汉模式:
public class Instance {
private static Instance ins=new Instance();
private Instance() {
}
public Instance getInstance() {
return ins;
}
}
特点:每次调用的时候都生成一个新的对象,占用内存,线程安全,但性能不好。
懒汉模式:
public class Instance {
private static Instance ins=null;
private Instance() {
}
public Instance getInstance() {
if(ins==null) {
ins=new Instance();
}
return ins;
}
}
特点:每次调用的时候先判断是否存在对象,存在直接调用,不存在,则生成一个新的对象,只生成一个对象,节省内存,但线程不安全。多线程调用第一次调用该方法的时候,当线程1只运行到if(ins==null)时,ins为null,未新建对象,跳到线程2,这时如果线程2恰巧也运行到if(ins==null)时,由于线程1还未来得及生成新对象,所以线程2得到的也是null,判断结果也为正确,故生成两个对象了,造成线程不安全问题。
双重锁定饿汉模式:
public class Instance {
private volatile static Instance ins=null;
private Instance() {
}
public Instance getInstance() {
synchronized (Instance.class) {
if(ins==null) {
ins=new Instance();
}
}
return ins;
}
}
因为有锁解决懒汉模式在多线程的时候出现的数据共享问题。