单例:开发中实现对于某个类只存在一个对象
懒汉式:在不调用时不创建对象,只有调用时才开始创建对象去实例化(相比于饿汉式对对象的渴望更低懒得去提前创建对象)
懒汉式实例化格式如下
方式一
普通懒汉式:多线程存在多线程安全问题 适用于单线程情况
class Bank {
//无参构造器
private Bank() {
super();
}
private static Bank instance = null;
public static Bank getInstance() {
if (instance == null) {
instance = new Bank();//对象实例化
}
return instance;
}
}
方式二
支持多线程的情况 线程安全但是效率低,因为每个线程进入getInstance()方法时都要进行判断是否实例化
class Bank {
//无参构造器
private Bank() {
super();
}
private static Bank instance = null;
public synchronized static Bank getInstance() {//加监视器
if (instance == null) {
instance = new Bank();//对象实例化
}
return instance;
}
}
方式三
双重锁:效率高 多线程安全
class Bank {
//无参构造器
private Bank() {
super();
};
private static Bank instance = null;
public static Bank getInstance() {
if (instance == null) {//判断是否实例化
synchronized (Bank.class) {//同步方法解决线程安全,监视器为该类
if (instance == null) {//再次判断是否实例化
instance = new Bank();//创建对象实例化
}
}
}
return instance;
}
}
总结:方式二通过synchronized实现加监视器弥补了方式一的多线程安全问题。但是由于第一个线程进入getInstance()方法后已经进行了实例化,但是后续进入的线程仍要等待进入getInstance()方法判断是否要实例化,导致执行效率降低。
方式三,在方式二的基础上通过getInstance()方法外的判断语句使得第一个线程后的线程无须再进行实例化等待。
-------------------------------------------------如有不当之处还望指正