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;
	}

总地来说单例模式还是比较简单的,要注意一点的是产生单例模式的方法要处理一下,适应多线程的情况。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值