经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式 - 单例模式(Singleton Pattern)
来源:cnblogs  作者:brucevon  时间:2018/11/29 9:23:37  对本文有异议

单例模式

介绍

  • 模式:创建型
  • 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点
  • 解决:一个全局使用的类频繁地创建与销毁
  • 场景:
    • 唯一序列号
    • web中的计数器
    • I/O与数据库的连接
    • ……  

实现方式

  • 饿汉式 :静态加载,线程安全

  1. 1 /**
  2. 2 * 单例模式:饿汉式
  3. 3 * 是否Lazy初始化:否
  4. 4 * 是否多线程安全:是
  5. 5 */
  6. 6 public class Singleton {
  7. 7
  8. 8 private static Singleton singleton = new Singleton();
  9. 9
  10. 10 // 构造器私有
  11. 11 private Singleton() {
  12. 12 }
  13. 13
  14. 14 // 实例方法
  15. 15 public static Singleton getInstance() {
  16. 16 return singleton;
  17. 17 }
  18. 18 }
Singleton.java
  • 懒汉式:单校验,线程不安全

  1. 1 /**
  2. 2 * 单例模式:懒汉式
  3. 3 * 是否Lazy初始化:是
  4. 4 * 是否多线程安全:否
  5. 5 */
  6. 6 public class Singleton {
  7. 7
  8. 8 private static Singleton singleton;
  9. 9
  10. 10 // 构造器私有
  11. 11 private Singleton() {
  12. 12
  13. 13 }
  14. 14
  15. 15 // 实例方法
  16. 16 public static Singleton getInstance() {
  17. 17 if (singleton == null) {
  18. 18 return new Singleton();
  19. 19 }
  20. 20 return singleton;
  21. 21 }
  22. 22 }
Sington.java
  • 懒汉式:实例方法同步锁,线程安全

  1. 1 /**
  2. 2 * 单例模式:懒汉式
  3. 3 * 是否Lazy初始化:是
  4. 4 * 是否多线程安全:是
  5. 5 */
  6. 6 public class Singleton {
  7. 7
  8. 8 private static Singleton singleton;
  9. 9
  10. 10 // 构造器私有
  11. 11 private Singleton() {
  12. 12
  13. 13 }
  14. 14
  15. 15 // 实例方法
  16. 16 public static synchronized Singleton getInstance() {
  17. 17 if (singleton == null) {
  18. 18 return new Singleton();
  19. 19 }
  20. 20 return singleton;
  21. 21 }
  22. 22 }
Sington.java
  • 懒汉式:双检锁/双重校验锁(DCL,double-checked locking),线程安全

  1. 1 /**
  2. 2 * 单例模式:懒汉式
  3. 3 * 是否Lazy初始化:是
  4. 4 * 是否多线程安全:是
  5. 5 */
  6. 6 public class Singleton {
  7. 7
  8. 8 private static volatile Singleton singleton;
  9. 9
  10. 10 // 构造器私有
  11. 11 private Singleton() {
  12. 12
  13. 13 }
  14. 14
  15. 15 // 实例方法
  16. 16 public static Singleton getInstance() {
  17. 17 if (singleton == null) {
  18. 18 synchronized (Singleton.class) {
  19. 19 if (singleton == null) {
  20. 20 return new Singleton();
  21. 21 }
  22. 22 }
  23. 23 }
  24. 24 return singleton;
  25. 25 }
  26. 26 }
Sington.java
  • 登记式/静态内部类:线程安全

  1. 1 /**
  2. 2 * 单例模式:登记式/静态内部类
  3. 3 * 是否Lazy初始化:是
  4. 4 * 是否多线程安全:是
  5. 5 */
  6. 6 public class Singleton {
  7. 7
  8. 8 // 静态内部类持有
  9. 9 private static class SingletonHolder {
  10. 10 private static final Singleton SINGLETON = new Singleton();
  11. 11 }
  12. 12
  13. 13 // 构造器私有
  14. 14 private Singleton() {
  15. 15
  16. 16 }
  17. 17
  18. 18 // 实例方法
  19. 19 public static Singleton getInstance() {
  20. 20 return SingletonHolder.SINGLETON;
  21. 21 }
  22. 22 }
Sington.java
  • 枚举:线程安全

  1. 1 /**
  2. 2 * 单例模式:枚举
  3. 3 * 是否Lazy初始化:否
  4. 4 * 是否多线程安全:是
  5. 5 */
  6. 6 public enum Singleton {
  7. 7 SINGLETON
  8. 8 }
Singleton.java

 

 

资料来源:阿里云大学 - 设计模式

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号