1:为什么使用到单例
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
2:懒汉方式(需要对象的时候,手动创建)
package com.imooc.o2o.cache;
public class Danli {
//第一步:voliate修饰类实例,防止指令重排
//1:可见性
//2:禁止指令重排
private volatile static Danli danli;
//第二部:私有构造函数,防止外部调用
private Danli() {
}
//第三步:静态方式,可以通过类直接调用
public static Danli getDanli() {
//第一个if 线程竞争,首先判断是否创建对象
if (danli==null) {
//如果对象为空,加锁对象方法
synchronized (Danli.class) {
//第二个if a线程创建对象之后释放锁,B线程进来再次判断是否为空
if (danli==null) {
//new创建对象分为三步,但是23的步骤是随机的
//1:分配内存空间
//2:初始化对象,构造器创建对象属性
//3:将对象空间地址赋值给栈中的引用
//volaite的作用是A线程在进入第二个if的时候创建对象
//可能步骤23重排,先执行了3,这个时候
//这个时候线程B进入第一个if,已经将地址指向对象的地址了
//然后返回的却是个没有完成初始化的对象
danli=new Danli();
}
}
}
return danli;
}
//测试方法 为true
public static void main(String[] args) {
Danli danli=Danli.getDanli();
Danli danli2=Danli.getDanli();
System.out.println(danli==danli2);
}
}
3:饿汉模式(类加载的时候创建)
package com.imooc.o2o.cache;
public class Danli1 {
//第一步:私有静态实例,随着类加载而创建
private static final Danli1 danli1=new Danli1();
//第二步:私有构造函数
private Danli1 () {}
//第三步:
public static Danli1 getDanli() {
return danli1;
}
public static void main(String[] args) {
Danli1 danli1=Danli1.getDanli();
Danli1 danli2=Danli1.getDanli();
System.out.println(danli1==danli2);
}
}