单例模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* @author BubbleTg <p> 单例模式模板01 饿汉式单例模式 一开始就线程安全。 */ public class SingletonPatternDemo01 {
//初始化时立即加载 private static SingletonPatternDemo01 instance = new SingletonPatternDemo01();
//构造器私有化 private SingletonPatternDemo01() { }
//返回,不需要同步,调用效率高 public static SingletonPatternDemo01 getInstance() { return instance; }
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* @author BubbleTg <p> 单例模式模板01 懒汉式单例模式 延迟加载,真正用到的时候才加载。 资源利用率高,但是由于需要同步,并发效率较低。 / public class SingletonPatternDemo02 { private static SingletonPatternDemo02 instance;
//构造器私有化 private SingletonPatternDemo02() { }
//同步,调用效率低 public static synchronized SingletonPatternDemo02 getInstance() { if (instance == null) { instance = new SingletonPatternDemo02(); } return instance; }
}
|
必须知道线程同步问题!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* @author BubbleTg <p> 单例模式模板03 双重实现锁实现单例模式 <p> 此种会出现的问题 因为编译器的优化原因和JVM底层内部模型原因,偶尔会出问题,不建议使用。 */ public class SingletonPatternDemo03 { private static SingletonPatternDemo03 instance = null;
//构造器私有化 private SingletonPatternDemo03() { }
public static SingletonPatternDemo03 getInstance() { if (instance == null) { SingletonPatternDemo03 sp; synchronized (SingletonPatternDemo03.class) { sp = instance; if (sp == null) { synchronized (SingletonPatternDemo03.class) { if (sp == null) { sp = new SingletonPatternDemo03(); } } instance = sp; }
} } return instance; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* @author BubbleTg <p> 单例模式模板04 静态内部类实现单例模式 <p> 也是一种懒加载,兼备了并发高效和延迟加载的优势! / public class SingletonPatternDemo04 {
private static class SingletonPatternInstance { private static final SingletonPatternDemo04 instance = new SingletonPatternDemo04(); }
//构造器私有化 private SingletonPatternDemo04() { }
//方法没有同步,调用效率高! public static SingletonPatternDemo04 getInstance() { return SingletonPatternInstance.instance; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* @author BubbleTg <p> 单例模式模板05 枚举实现单例模式 <p> 缺点:没有延迟加载 优点: 线程安全,调用效率高,天然防止反射和反序列化漏洞! / public enum SingletonPatternDemo05 {
//这个枚举元素,本身就是单例 INSTANCE;
//添加自己需要的操作 public void singletonOperation(){ } } |
-常见的五种单例模式实现方式
-主要:
-饿汉式(线程安全,调用效率高。但是,不能延时加载。)
•懒汉式(线程安全,调用效率不高。但是,可以延时加载。)
-其他:
•双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
•静态内部类式(线程安全,调用效率高。但是,可以延时加载)
•枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列 化漏洞!)
•如何选用?
-单例对象占用资源少,不需要延时加载:
•枚举式好于饿汉式
-单例对象占用资源大,需要延时加载:
•静态内部类式 好于 懒汉式
还没有评论,来说两句吧...