单例模式的类图还是比较简单,自己管理自己的实例,看一下类图

Singleton学习笔记


用到的单例的地方还是比较多的,比如在手机游戏开发中,背景音乐的管理就可以设置成一个单例,只要设置成为静音,不管在游戏中如何切换都是静音的


单例模式的三个基本要素是:私有构造器+私有静态成员变量+全局静态方法


而传统的延迟加载在多线程的应用中很容易出现问题,会产生多个对象,造成一些莫名其妙的问题,传统的延迟加载的代码如下:

// 1、创建一个全局的静态常量引用 private static MusicPlayer uniqueInstance; // 2、私有化构造方法 private MusicPlayer() { } // 3、创建取得取得单例对象的方法 // 3-1、非线程安全取得对象的方法(延迟加载) public static MusicPlayer getInstance() { if (uniqueInstance == null) { uniqueInstance = new MusicPlayer(); } return uniqueInstance; }
而解决线程完全的方法有三种:

1、方法加同步:

// 3-2、通过synchronized同步保证线程安全,但效率会下降很多 public synchronized static MusicPlayer getInstance() { if (uniqueInstance == null) { uniqueInstance = new MusicPlayer(); } return uniqueInstance; }
2、采用积极加载的方式:

// 3-3、通过积极加载在JVM加载这个类是马上创建一个单件实例 private static MusicPlayer uniqueInstance = new MusicPlayer(); public static MusicPlayer getInstance() { if (uniqueInstance == null) { uniqueInstance = new MusicPlayer(); } return uniqueInstance; }
3、双重加锁检测:

// 3-4、双重检测加锁(Jdk版本要求5+) private volatile static MusicPlayer uniqueInstance; public static MusicPlayer getInstance() { if (uniqueInstance == null) { synchronized (MusicPlayer.class) { if (uniqueInstance == null) { uniqueInstance = new MusicPlayer(); } } } return uniqueInstance; }
总地来说单例模式还是比较简单的,要注意一点的是产生单例模式的方法要处理一下,适应多线程的情况。


相关文章:

  • 2021-08-14
  • 2022-01-16
  • 2021-08-27
  • 2022-12-23
  • 2021-08-21
  • 2021-08-08
  • 2022-12-23
猜你喜欢
  • 2021-12-17
  • 2021-10-06
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2022-12-23
  • 2021-06-29
相关资源
相似解决方案