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) 则是为了在未创建该类的对象时,保证第一批执行此方法的线程之创建一个类对象,这样既保证了单例模式的实现,又解决了单例模式的线程安全性问题。

浙公网安备 33010602011771号