普通的饿汉式单例模式
public class Danli {
//单例模式必备;私有化构造函数
//只有当前类中构造函数可以使用
private Danli() {
}
//饿汉式创建单例对象
private static Danli danli = new Danli();
public static Danli getDanli() {
return danli;
}
}
普通的懒汉式单例模式
class Danli2 {
//单例模式必备;私有化构造函数
//只有当前类中构造函数可以使用
public static Danli2 danli2;
private Danli2() {
}
//懒汉式创建单例对象
public static Danli2 getDanli() {
if(danli2 == null) {
danli2 = new Danli2();
}
return danli2;
}
解决并发的懒汉式
class Danli3 {
private Danli3() {}
//在这里加volatile 的原因是为了避免编译指令重排问题,避免拿到未初始化完成的对象
private static volatile Danli3 danli3;
public static Danli3 getdanli() {
Danli3 temp = danli3;//临时变量,提高执行效率,由于大部分访问时是不为空的,使用临时变量减少volatile属性访问,提高效率
if(temp == null) {//第一重判断非空,用于非并发环境,阻拦对象创建后的大部分访问,提高效率
synchronized (Danli3.class) {
if(temp == null) {//第二次判断,解决首次创建对象的并发问题
danli3 = new Danli3();
}
}
}
return danli3;
}
}