单例模式——懒汉式单例模式示例

 饿汉式改良——懒汉式单例(线程安全效率低,推荐方法二)

package pojo;

/**
 * 懒汉式线程安全写法 : 延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。(经典写法去掉线程安全限制)
 * 
 * 要点 : 1.属性和构造方法私有化 2.属性用static和volatile修饰 3.获取方法双重检查锁
 * 
 * 线程安全 , 效率较低
 * @author exit
 *
 */
public class SingleTon {
	/**
	 * 用volatile 修饰 稍弱的同步机制 用来确保将变量的更新操作通知到其他线程。
	 * 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。
	 * volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
	 */
	private static volatile SingleTon instance;

	// 私有化构造
	private SingleTon() {

	}

	// 静态方法,向整个应用提供单例获取方式
	// 双重检查锁
	public static SingleTon getInstance() {
		if (instance == null) {
			synchronized (SingleTon.class) {
				if (instance == null) {
					instance = new SingleTon();
				}
			}
			instance = new SingleTon();
		}
		return instance;
	}
}

改进懒汉式单例模式  ——现在最完整的单例写法

package pojo;

/**
 * 改进试懒汉单例模式 , 除了effctive java中阐述的枚举单例实现,这种方法是目前最好的实现方式
 * 
 * 线程安全、效率高
 * 
 * @author exit
 *
 */
public class SingleTon {

	/**
	 * 利用静态内部类特性实现外部类的单例 
	 * 其主要原理为:Java中静态内部类可以访问其外部类的成员属性和方法,
	 * 同时,静态内部类只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式,在静态内部类中静态初始化外部类的单一实例即可。
	 * 
	 * @author exit
	 *
	 */
	private static class SingleTonBuilder {
		private static SingleTon singleTon = new SingleTon();
	}

	// 私有化构造
	private SingleTon() {

	}

	public SingleTon getInstance() {
		return SingleTonBuilder.singleTon;
	}
}

详细解释请移步:  https://www.cnblogs.com/zhengyu940115/p/6652465.html

你可能感兴趣的:(设计模式)