设计模式之单例模式

一、拍脑袋想的版本:

package singleton;

//单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
//此种方式存在线程安全问题。
public class SimpleSingleton {
	
	private static SimpleSingleton instance;
	
	//为了保证一个类只有一个实例,那构造函数需要私有化,防止外部随意生成实例。
	private SimpleSingleton(){}
	
	//提供一个全局的访问点  并且是懒加载的
	public static SimpleSingleton  getInstance(){
		if(instance==null){
			instance=new SimpleSingleton();
		}
		return instance;
	}

}

  二、线程安全版本(性能存在缺陷)

package singleton;

public class SafeSingleton {
	
	public static SafeSingleton instance;
	
	private SafeSingleton(){}
	//加入synchronized保证线程安全,但存在性能问题,其实只有在第一个生成instance时
	//才需要加锁保证线程安全,接下来获取instance时并不需要加锁了。
	public static synchronized SafeSingleton getInstance(){
		if(instance==null){
			instance=new SafeSingleton();
		}
		return instance;
	}

}

  三、高效且线程安全版本

package singleton;

public class PerfactSingleton {
	
	private volatile static PerfactSingleton instance;
	private PerfactSingleton(){}
	public static PerfactSingleton getInstance(){
		if(instance==null){
			synchronized (PerfactSingleton.class) {
				instance=new PerfactSingleton();
			}
		}
		return instance;
	}

}

 四、饿加载方式

package singleton;

public class EagerSingleton {
	
	private static EagerSingleton instance=new EagerSingleton();
	private EagerSingleton(){}
	public static EagerSingleton getInstance(){
		return instance;
	}

}

  

原文地址:https://www.cnblogs.com/silenceshining/p/9108466.html