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

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

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

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

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

 
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静态代码块

 对于单例模式,借用 《Effective Java》一书中的话,单元素的枚举类型已经成为实现Singleton的最佳方法。所以在此加上枚举单例的实现

public enum SingleTon {INSTANCE,INSTANCE2;/** 创建enum时,编译器会自动为我们生成一个继承自java.lang.Enum的类,我们上面的enum可以简单看作:* class SingleTon extends Enum{*         public static final INTANCE;*         public static final INTANCE2;* * }*/static{INSTANCE.type = "初始化INSTANCE的某些属性";}String type;public String getType(){return type;}}

 

 



转载于:https://www.cnblogs.com/summer-yuf/p/10248011.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部