三种推荐使用的单例模式解析
1,双检锁/双重校验锁(DCL,即 double-checked locking)
public class Singleton {
private volatile static Singleton singleton;
private Singleton {}
public static Singleton getInstance {
if (singleton==null) {
synchronized (Singleton.class) {
if (singleton==null) {
singleton=new Singleton;
}
}
}
return singleton;
}
}
Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton==null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton==null),直接return实例化对象。
优点:线程安全;延迟加载;效率较高。
2,静态内部类
public class Singleton {
private Singleton {}
private static class SingletonInstance {
private static final Singleton INSTANCE=new Singleton;
}
public static Singleton getInstance {
return SingletonInstance.INSTANCE;
}
}
这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
优点:避免了线程不安全,延迟加载,效率高。
3,枚举
public enum Singleton {
INSTANCE;
public void whateverMethod {
}
}
这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。
这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少用。
不能通过 reflection attack 来调用私有构造方法。
上一篇:别上陌陌探探了,靠谱女孩都在这里!
下一篇:《夕阳热气球》短篇请叫我牛顿爵士
街舞资讯热门
- 福清佾舞,入选福建省第五批国家级非遗代表性项目拟推荐名单
- 医护跳天鹅舞送治愈病人出院,中国人自娱自乐的天性藏不住了
- 韩国航班落地威海,167人全部被隔离14天,暂不提升中国入境限制
- 赵奕欢为了红太拼了,穿比基尼跳钢管舞,“马蜂臀”尽显火辣身材
- 《朋友请听好》谢娜独挑“易燃装置”和易烊千玺battle俏皮女团舞
- 你大妈还是你大妈,朝阳大妈的无接触广场舞火了!!
- 关于舞蹈基本功
- 集歌、舞、乐为一体的艺术表现形式——楚国崇巫之风
- 易烊千玺和谢娜PK舞技,大胆挑战女团舞萌坏何炅,谢娜输得好惨
- 农村女孩的追梦路:爱跳就大胆的舞起来吧!
- 平顶山叶县电视台《广场舞秀》方案解读
- 易烊千玺与谢娜pk女团舞,易烊千玺跳得更有女人味,表情亮了
- 大妈自创无接触广场舞“云跳舞”宣传防疫知识
- 五大民族舞蹈的区别,你知道多少
- 广场舞适合每个人
- 体育舞蹈理论基础知识--体育舞蹈发展概况
- 超模AA穿亮钻吊带配镂空喇叭裤,却像是复古夜店舞女,绝美性感
- 外观精致时尚的新一代奔驰GLA于日内瓦车展亮相
- 时尚到底是什么呢?
- 火爆时装周的香芋紫,又飒又仙又好搭,2020年时尚达人必Pick
- 甜美女孩总让人有好感!碎花短连衣裙优雅大气,土妞秒变时尚达人
- 白雪公主Lily Collins放开了,真空穿西装配短裤,时尚性感有魅力
- 占据时尚圈半壁江山的单品,显高又显瘦,短款上衣竟如此火爆?
- Dior春夏高定秀 | 女性的战歌,时尚的崛起
- 16套最值得get的新潮搭配,吸睛感十足,时尚更有范