Java单例模式(饿汉式,懒汉式),我更愿称作(传统销售式,饥饿营销式)

单例模式是一个很经典的设计模式,在java中无处不在。比如spring中的bean注入,工具类的编写等。

但是在刚接触单例模式时候,我总对这个饱汉式和饿汉式的称呼理解不好。下面来讲一讲我自己的理解。

1)饿汉模式(传统销售式)

class A{  
    private A(){}
    private static A instance = new A();//这里更像传统销售产品,加载类时,先把商品(实例)准备好
    public static A getInstance(){
        return instance;//传统的销售模式,我已经准备好商品了,你需要,我直接给你。
    }
 }
!注意:该模式如果A类中的东西很多,那么创建A对象时所花时间更多(整个类的加载变慢了)

这里还可以用枚举来实现单例,推荐使用这种方法来实现单例模式,简单粗暴高效有没有。

public enum SingletonEnum {
    INSTANCE1("实例1",1),INSTANCE2("实例2",2);
    /**
     * 实际上INSTANCE1变量的默认缺省等于是:
     * public static final INSTANCE1 = new  SingletonEnum("实例1",1);
     * 所以,语法糖的味道你知道
    */
    SingletonEnum(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "SingletonEnum{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}
//测试类
public class Test {
    public static void main(String[] args){
        System.out.println(SingletonEnum.INSTANCE1);
        System.out.println(SingletonEnum.INSTANCE2.getName());
    }
}

 

2)懒汉模式(饥饿营销式)

 

class A{  
    private A(){}
    private static A instance;    
    public static A getInstance(){//在加载类的时候不创建A对象,不生产B商品,在有人预定的时候,再去生产(创建A对象)
        if(instance == null){
            //买家1(线程1) 买家2(线程2)
            instance = new A();//这里就会有线程安全问题,如果买家1预定了,A对象还没生成完,买家2又开始预定,那么就会生成两个不同的A,破坏了单例。
        }
        return instance;
    }
 }
!!!注意:该模式存在线程安全问题
解决方式:添加synchronized关键字到静态方法,参数传入(A.class),或者在if语句外,添加synchronized静态代码块

 

 

你可能感兴趣的:(设计模式)