设计模式专题之单例模式

1.单例模式 恶汉式
 特点:天生线程安全,效率高,但是不能延迟加载

package com.wangyu;

/**
 * 单例模式 恶汉式
 * 特点:天生线程安全,效率高,但是不能延迟加载
 * @author zjmiec
 *
 */
public class SingletonDemo1 {

	// 类初始化立即加载
	private static SingletonDemo1 instance = new SingletonDemo1();

	private   SingletonDemo1() {}
	public  static SingletonDemo1  getInstance() {
		return instance;
}
	
}

2.  单例模式 懒汉式

package com.wangyu;

import com.sun.corba.se.impl.orbutil.concurrent.Sync;

/**
 * 单例模式 懒汉式 特点,效率低,支持延迟加载 资源利用率高了,但是并发效率低 synchronized 要同步
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo2 {

	// 类初始化不会立即加载,用到的时候创建
	private static SingletonDemo2 instance;

	private SingletonDemo2() {
	}

	public static synchronized SingletonDemo2 getInstance() {
		if (instance == null) {
			instance = new SingletonDemo2();
		}
		return instance;
	}

}

3. 双重锁机制实现单例模式

package com.wangyu;

/**
 * 
 * 双重锁机制实现单例模式 (由于jvm底层优化,使用过程会出现问题不建议使用)
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo3 {

	// 类初始化不会立即加载,用到的时候创建
	private static SingletonDemo3 instance = null;

	private SingletonDemo3() {
	}

	public static synchronized SingletonDemo3 getInstance() {
		if (instance == null) {
			SingletonDemo3 sc;
			synchronized (SingletonDemo3.class) {
				sc = instance;
				if (sc == null) {
					synchronized (SingletonDemo3.class) {
						if (sc == null) {
							sc = new SingletonDemo3();
						}

					}
					instance=sc;
				}
			}
		}
		 return instance;
	}

}

4.静态内部类方式实单例模式

package com.wangyu;

/**
 * 
 * 静态内部类方式实单例模式
 *  特点:
 *  没有static属性,不会像恶汉模式立即加载 只有真正调用的geiInstance,
 *  才会加载静态内部类,且加载过程线程安全
 * instances是 static final类型,保证内存中只有一个实例,
 * 而且只能被赋值一次 保证线程安全,同时兼备并发高效和延迟加载的优势
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo4 {

	private static class SingletonClassInstance {
		private static final SingletonDemo4 instance =new SingletonDemo4();
	}

	private SingletonDemo4() {
	}

	public SingletonDemo4 getInstance(){
		return SingletonClassInstance.instance;
	}
}

5.枚举方式实现单利模式

package com.wangyu;

/**
 * 枚举方式实现单利模式(没有延迟加载的属性)
 * 线程安全调用效率高
 * @author zjmiec
 *
 */
public enum SingletonDemo5 {
	// 这个枚举元素,本身就是单例
	INSTANCE;
	//添加自己的操作
	public void singletonOperation() {
	}
}

测试:

对比总结:

常见的五种单例模式实现方式

一主要:
       ------饿汉式(线程安全,调用效率高。 但是,不能延时加载。 )。

       ------懒汉式(线程安全,调用效率不高。但是,可以延时加载。 )

一其他:
       ------双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)。

       ------静态内部类式(线程安全,调用效率高。但是,可以延时加载)
       ------枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列化漏洞!)
如何选用?
       -------单例对象占用资源少,不需要延时加载:
              枚举式好于饿汉式
       ------单例对象占用资源大,需要延时加载:
             静态内部类式  好于懒汉式

猜你喜欢

转载自blog.csdn.net/qq_41988225/article/details/84854154