设计模式之单例模式 | Enplee's blog
0%

设计模式之单例模式

设计模式之单例模式

定义:
> 确保一个类只有一个实例,并提供一个类的全局访问点。

实现一:
> 饿汉式
>
> 类加载到内存后就实例化一个单例,通过JVM保证了线程安全,简单实用.
>
> 缺点:无论单例是否被使用,类加载时就会被实例化(......吹毛求疵)
1
2
3
4
5
6
7
8
9
public class Sgt01 {
private static final Sgt01 INSTENCE = new Sgt01();

private Sgt01() { // 将构造方法定义为private,杜绝new.
}
public static Sgt01 getInstance(){
return INSTENCE;
}
}
实现二
> 懒汉式
>
> 实现了使用时才创建的要求
>
> 但是线程不安全
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Sgt02 {
private static Sgt02 INSTENCE;

private Sgt02(){
}

public static Sgt02 getInstence(){
if(INSTENCE==null){
INSTENCE = new Sgt02();
}
return INSTENCE;
}
}
实现三
> 懒汉式加锁
>
> 解决了线程安全,但是效率变低
1
2
3
4
5
6
7
8
9
10
11
12
public class Sgt03 {
private static Sgt03 INSTENCE;
private Sgt03(){
}

public static synchronized Sgt03 getInstence(){ //加锁
if(INSTENCE==null){
INSTENCE = new Sgt03();
}
return INSTENCE;
}
}
实现四
> 双重检查式
>
> 尽可能的提升了加锁之后的效率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Sgt04 {
private static volatile Sgt04 INSTENCE; //加入volatile防止JVM指令重排
private Sgt04(){
}

public static synchronized Sgt04 getInstence(){
if(INSTENCE==null){
//双重检查
synchronized (Sgt04.class){
if(INSTENCE==null){
INSTENCE = new Sgt04();
}
}
}
return INSTENCE;
}
}
实现五
> 静态内部类
>
> 原理: 虚拟机在加载外部类时候不会加载内部类,只有用到是才加载,实现了懒加载
>
> 线程安全的,和饿汉式一样,是JVM保证的线程安全
1
2
3
4
5
6
7
8
9
10
11
12
public class Sgt05 {
private Sgt05(){
}

private static class Sgt05Holder{
private final static Sgt05 INSTENCE = new Sgt05();
}

public static Sgt05 getInstance(){
return Sgt05Holder.INSTENCE;
}
}
实现六
> 枚举单例
>
> 不仅可以枚举单例还可以防止反序列化。
1
2
3
4
5
6
7
public enum  Sgt06 {

INSTENCE;

public void m(){};

}
-------------本文结束感谢您的阅读-------------