首页 > 代码库 > 单例模式
单例模式
单例模式,作为一种常用,且在很多框架中非常常用的模式,比如springMVC中默认的就是用单例。
今天就来讲讲单例模式都有哪些,以及有何区别,有何优点缺点。
1. 饿汉模式,顾名思议,即是提前把这个单例给好了。优:线程安全;缺:初始加载,不管有用没有;
2. 懒加载,分好几种。是不是该加点代码的,最后我会将我github地址给出。
a. 在返回实例接口中,判断为空则new。缺点:非线性安全;
b. 对返回实例接口作同步,加synchronized关键字,保证线性安全。缺点:效率不高。同步大篇代码块同样问题;
c. 对new操作加synchroized关键字保证new操作线程安全。缺点:保证不了单例;
d. 在c的基础上再加一层if null 判断,即双重检查锁DCL。
3. 静态内部类。优点:实现延迟加载,线程安全。感觉这个挺nice,在真实上亿级pv项目中使用过。对了,这里有个如果在序列化场景中,反序列化会
出现多例,可通过readResolve解决;
4. 静态代码块,这个感觉不到与饿汉模式有啥区别,有懂的请留言,谢谢!!!
5. 枚举,利用枚举是内部构造函数特点,只定义一个枚举变量,有暴露和隐藏式两种(PS:名字是我自己想的),前者会暴露枚举,后者不会。
说了那多代码呢,在这:https://github.com/wdmyong/singleton
不想去的朋友们,我这里也贴两个。
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff } span.s1 { color: #931a68 } span.s2 { color: #0326cc } span.s3 { color: #000000 } span.s4 { color: #7e504f }</style>package com.wdm.singleton.impl;
/*
* 饿汉模式,声明的时候就初始化了。
*/
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private String name;
private HungrySingleton() {
this.name = "HungrySingleton";
}
public static HungrySingleton getInstance() {
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff } span.s1 { color: #931a68 } span.s2 { color: #000000 } span.s3 { color: #0326cc } span.s4 { color: #7e504f }</style>package com.wdm.singleton.impl;
/*
* 静态内部类,由于采用了静态内部类保证了延迟加载,同时采用静态变量保证线程安全
*/
public class StaticInnerClassSingleton {
private static class StaticInnerClassSingletonHolder {
// final修饰符是必要的么,mark一下
private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
}
private String name;
private StaticInnerClassSingleton() {
this.name = "StaticInnerClassSingleton";
}
public static StaticInnerClassSingleton getInstance() {
return StaticInnerClassSingletonHolder.instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
单例模式