剑指offer-单例模式

单例模式

    • 定义和特点
    • 思路
    • 代码实现

定义和特点

单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式

单例模式有 3 个特点:
1. 单例类只有一个实例对象;
2. 该单例对象必须由单例类自行创建;
3. 单例类对外提供一个访问该单例的全局访问点;

思路

单例模式,有“懒汉式” 和 “饿汉式”,等不同的形式
主要思路就三步:

1.私有化构造函数(防止外部实例化)
2.创建私有化的实例成员变量(用于存储创建的实例)
3.提供一个公共的方法,用于返回实例调用对象

当然,我们还需要考虑在多线程的情况下,线程安全的问题

代码实现

1.饿汉式的实现方式

package com.offer.test;

/**  
 * “饿汉式” 单例模式
 * 这种模式的特点在于一旦创建或是加载,就创建一个单例。保证在调用 getInstance方法之前,就已经存在了  instance 对象
 * 
 * @author [email protected]  
 * @date 2019年7月23日 上午10:43:33 
 */
public class SingletonHungry {
	// 1.私有化构造函数
	private SingletonHungry() {}
	
	// 2.私有化创建对象
	private static SingletonHungry instance = new SingletonHungry();
	
	// 提供一个公共的方法,用于调用者调用
	public static SingletonHungry getInstance(){
		return instance;
	}
}

2.懒汉式的实现方式

package com.offer.test;

/**  
 * “懒汉式” 单例模式的加载方式
 * 每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。
 * 
 * @author [email protected]  
 * @date 2019年7月23日 上午10:50:57 
 */
public class SingletonLazy {
	// 1.创建私有的构造函数,防止外部的初始化
	private SingletonLazy(){}
	// 2.私有化成员对象为null 
	private static volatile SingletonLazy instance = null;  // volatile 保证  instance 在多线程之间可以保持同步
	
	// 3.提供一个公共的获取成员对象的方法,
	public static synchronized SingletonLazy getInstance() {
		if (instance == null) {
			instance = new SingletonLazy();
		}
		return instance;
	}
}

以上懒汉式懒汉式有一个缺点,那就是在多线程的情况下,每一次调用 getInstance 方法的时候,都会阻塞,效率很低
以下为解决上面的问题的另一种解决方案,不同步整个方法,而是同步局部代码块

/**  
 * “懒汉式” 单例模式的加载方式
 * 每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。
 * 
 * @author [email protected]  
 * @date 2019年7月23日 上午10:50:57 
 */
public class SingletonLazy2 {
	// 1.创建私有的构造函数,防止外部的初始化
	private SingletonLazy2(){}
	// 2.私有化成员对象为null 
	private static volatile SingletonLazy2 instance = null;  // volatile 保证  instance 在多线程之间可以保持同步
	
	// 3.提供一个公共的获取成员对象的方法
	public static SingletonLazy2 getInstance() {
		
		if (instance == null) { //  先判断对象是否实例化了,如果没有实例化的话,那就进行实例化
			synchronized (SingletonLazy2.class) { 	// 仅在此处进行同步了,现获取到对象锁,如果多线程获取到锁,创建对象,当对象创建成功之后,后序的多线程就直接获取到对象直接返回,而不会进入到同步代码块里面了
				if (instance == null) {
					instance = new SingletonLazy2();
				}
			}
		}
		return instance;
	}
}

你可能感兴趣的:(剑指offer)