java设计模式——单例

概念:

     单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

应用场景:

   计数器,生成唯一序列,创建频繁但又频繁使用的对象,创建比较耗时的对象等等需要用到单例的情景

注意:

   单例模式不适用于频繁变化的对象

   单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

创建方式:

这里介绍三种

   1.饿汉模式(推荐)

/**
 * 饿汉模式 线程安全 比较常用,但容易产生垃圾对象 优点:没有加锁,执行效率高 缺点:类加载时会初始化,浪费内存
 * 
 * @author fanqiang
 *
 */
public class Singleton {

	private static Singleton singleton = new Singleton();

	// 私有化构造函数
	private Singleton() {
	};

	public static Singleton getInstance() {
		return singleton;
	}
	
	public static void main(String[] args) {
		//调用方式
		Singleton singleton = Singleton.getInstance();
	}

}

     

2.懒汉模式(线程安全)

/**
 * 线程安全的懒汉单例模式,具备延时加载,第一次调用才初始化,避免浪费内存,缺点:性能低
 * 
 * @author fanqiang
 *
 */
public class SingletonLazy {
	
	private static SingletonLazy singletonLazy;
	
	private SingletonLazy(){
		
	}
	public static synchronized SingletonLazy getInstance(){
		if(singletonLazy == null){
			singletonLazy = new SingletonLazy();
		}
		return singletonLazy;
		
	}

}

 3.double-checked locking(双重锁机制)

/**
 * 双重锁机制单例,具备延时加载,线程安全,在多线程情况下保持高性能
 * 
 * @author fanqiang
 *
 */
public class SingletonDCL {

	private volatile static SingletonDCL singletonDCL;

	private SingletonDCL() {
	}

	public static SingletonDCL getInstance() {
		if (singletonDCL == null) {// 1  
			synchronized (SingletonDCL.class) {
				if(singletonDCL == null){// 2
				singletonDCL = new SingletonDCL();
				}
			}
		}
		return singletonDCL;
	}
}

  

 

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