Loading

Java中的单例模式

描述


采取某种方法使得整个软件系统之中,保证某个类只存在一个对象,减少对象的创建次数从而减少系统的资源开销。

应用场景


  • 网站的计数器
  • 应用程序的日志
  • 数据库连接池
  • 项目中读取配置文件的类
  • Application也是单例的典型应用
  • Windows的Task Manager(任务管理器)
  • Windows的Recycle Bin(回收站)

单例模式的实现


饿汉式
public class Bank{
	// 1.将类的构造器私有化,防止外部调用类的构造器创建对象
	private Bank(){}
	
	// 2.内部创建静态的私有化对象
	private static Bank instance = new Bank();
	
	// 3.提供公共静态方法返回类的对象
	public static void getInstance(){
		return instance;
	}
}

在外部调用类中提供的公共静态方法 getInstance() 即可获得该类的对象。

懒汉式
public class Bank{
	// 1.将类的构造器私有化,防止外部调用类的构造器创建对象
	private Bank(){}
	
	// 2.内部声明静态的私有化对象,但是并不初始化
	private static Bank instance = null;

	// 3.提供公共静态方法
	public static void getInstance(){
		if(instance == null){
			instance = new Bank();
		}
		return instance;
	}
}

懒汉式存在着线程安全的问题,因此需要通过线程同步机制进行解决

public class Bank{
	// 1.将类的构造器私有化,防止外部调用类的构造器创建对象
	private Bank(){}
	
	// 2.内部声明静态的私有化对象,但是并不初始化
	private static Bank instance = null;

	// 3.提供公共静态方法
	public static void getInstance(){
		if(instance == null){
			synchronized(Bank.class()){
				if(instance == null){
					instance = new Bank();
				}
			}
		}
		return instance;
	}
}

对于上面 getInstance() 方法的解释:两次 if(instance == null) 的判断的作用有差别,外层的 if(instance == null) 是为了在已创建好该类的对象的时候,再执行此方法的线程不再进行同步机制,而是直接返回 instance ,以此操作来减少过多的同步操作对系统资源开销的影响,内层的 if(instance == null) 则是为了在未创建该类的对象时,保证第一批执行此方法的线程之创建一个类对象,这样既保证了单例模式的实现,又解决了单例模式的线程安全性问题。

posted @ 2020-02-21 15:36  Icdd  阅读(100)  评论(0)    收藏  举报