餓漢式(上來就是干)
優(yōu)點(diǎn):線程安全陵叽、調(diào)用效率高
缺點(diǎn):不能延時(shí)加載翘贮,不用的時(shí)候回浪費(fèi)資源
/**
* @author wyd
* @description 類加載的時(shí)候天然線程安全,不用加同步塊
* @date 2019/3/20 下午3:54
*/
public class SingletonTest1 {
private static SingletonTest1 instance = new SingletonTest1();
private SingletonTest1() {
}
public static SingletonTest1 getInstance() {
return instance;
}
}
懶漢式(延時(shí))
- 單例對(duì)象延時(shí)加載
優(yōu)點(diǎn):用的時(shí)候加載几睛,資源利用高
缺點(diǎn):并發(fā)效率低
public class SingletonTest2 {
private static SingletonTest2 instance;
private SingletonTest2() {
}
public static SingletonTest2 getInstance() {
//如果同步塊放到這里則會(huì)影響效率阶淘,如果存在對(duì)象直接返回
if (instance == null) {//提高效率
synchronized (SingletonTest2.class) {
if (instance == null) {//安全
instance = new SingletonTest2();
}
}
}
return instance;
}
}
- 靜態(tài)內(nèi)部類方式實(shí)現(xiàn)
優(yōu)點(diǎn):調(diào)用getInstance的時(shí)候才會(huì)去加載靜態(tài)內(nèi)部類,而且是線程安全的笔刹,并發(fā)高效芥备,延時(shí)加載
public class SingletonTest3 {
private SingletonTest3() {
}
private static class SingletlonInstance {
private static final SingletonTest3 instance = new SingletonTest3();
}
public static SingletonTest3 getInstance() {
return SingletlonInstance.instance;
}
}
枚舉實(shí)現(xiàn)
優(yōu)點(diǎn):枚舉自身就是單例模式,天然線程安全舌菜,同時(shí)可以避免反序列化和反射的漏洞
缺點(diǎn):無延時(shí)
public enum SingletonEnum {
INSTANCE;
public void singletonOperation() {
//相關(guān)操作
System.out.println("我是枚舉的單例啊啊啊啊啊");
}
}
該如何用呢萌壳?
- 單例的對(duì)象如果占用的資源少,不需要延時(shí)加載日月,枚舉優(yōu)于餓漢式
- 單例的對(duì)象如果占用的資源大袱瓮,需要延時(shí)加載,靜態(tài)內(nèi)部類優(yōu)于懶漢式
如果有問題山孔,請(qǐng)留言懂讯,相互探探討哦^