1.单例模式的概念
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
你可能会想,我在创建对象的时候,先判断是不是null,不是null就直接获得,是null就创建实例。
“生孩子还是不生孩子”应该是夫妻的责任,而不是我的责任。如果按照上面的想法,那么我就需要先判断一下才可以,这样“能不能生”就成了我的责任了哦。
我们把“生一个孩子”的责任交给类,我们只需要去获得就完事了。
2.第一种实现---饿汉式
JVM加载类的时候先实例化了
优点:JVM加载类是线程安全
缺点:不能懒加载
package com.dingyu;/** * 饿汉式单例模式 ,效率高
* 线程安全,不需要synchronized关键字,但是不能懒加载
* @author dingyu
*
*/publicclass Singleton01 {
privatestaticSingleton01 instance =new Singleton01();
private Singleton01() {
}
publicstatic Singleton01 getSingleton() {
return instance;
}
}
3.第二种实现---懒汉式
调用方法的时候再去创建实例
优点:懒加载
缺点:需要同步(不同步,如果线程a,线程b同时调用getSingleton(),相当于new了两次),效率不高
package com.dingyu;/** * 懒汉式单例模式
* 优点:懒加载
* 缺点:需要同步
* @author dingyu
*
*/publicclass Singleton02 {
privatestaticSingleton02 instance =null;
private Singleton02() {
}
privatestaticsynchronized Singleton02 getSingleton() {
if(instance ==null)
instance =new Singleton02();
return instance;
}
}
4.第三种实现---双重锁定(尽量别用)
如果第一次获得就加锁,创建。其他的时候就直接返回就可以。
优点:效率高,可以懒加载
缺点: JVM内部的原因会出现不可预知的错误(本人还没去了解原因,如果有知道的可以告诉我下,感谢)
为什么要判断两次null,大话设计模式中解释了:如果线程a,线程b,通过突破了第一层null,线程a获得锁,线程b等着。a创建了个实例,释放锁,b获得锁,继续运行,如果没有第二层null,那么b仍然会创建一个实例,破坏单例模式。
package com.dingyu;/** * 双重检测锁实现单例模式
*
* @author dingyu
*
*/publicclass Singleton03 {
privatestaticSingleton03 instance =null;
private Singleton03() {
}
publicstatic Singleton03 getSingleton() {
if(instance ==null) {
synchronized(Singleton03.class) {
if(instance ==null) {
instance =new Singleton03();
}
}
}
return instance;
}
}
5.第四种实现---静态内部类(推荐)
静态内部类是你用到他的时候,他才会加载,而且加载类的时候是线程安全的,不需要同步
优点:懒加载,效率高
package com.dingyu;/** * 静态内部类实现单例模式
* @author dingyu
*
*/publicclass Singleton04 {
private Singleton04() {
}
privatestaticclass SingletonInnerClass {
privatestaticSingleton04 instance =new Singleton04();
}
privatestatic Singleton04 getSingleton() {
return SingletonInnerClass.instance;
}
}
6.第五种实现---枚举(推荐)
枚举很特殊,JVM帮我们实现的单例,天然是单例的
优点:效率高,反射破解不了
缺点:不能懒加载
package com.dingyu;/** * 枚举实现单例 枚举本来就是单例的
*
* @author dingyu
*
*/publicenum Singleton05 {
INSTANCE;
}
欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:828697593
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢
哦对了,喜欢就别忘了关注一下哦~