单例模式是java中常见的一种设计模式,它提供了一种创建对象的最佳方式。单例模式涉及到一个单一的类,该类负责创建自己的对象,并确保只有一个对象被创建。该类提供了唯一对象的方式,不需要创建该对象,可直接访问。单例模式需要注意以下三点:
1.单例类只能有一个实例对象
2.单例类必须自己创建属于自己的唯一对象
3.单例类必须提供唯一对象的全局访问方式
先简单看一下单例模式的大致实现:
public class SingleObject {
//初始化SingleObject对象时未进行new操作,称为懒汉式
private static SingleObject instance;
//单例对象只能有一个实例对象,所以不能被创建对象,故将构造方法设为私有
private SingleObject(){}
//getInstance是获取单例对象的方法
private static SingleObject getInstance(){
if (instance == null){
instance = new SingleObject();
}
return instance;
}
}
单例模式常用的五种实现方式:懒汉式、饿汉式、双重检验锁、登记式、枚举。
1.懒汉式
public class SingleObject {
/**
* 初始化SingleObject对象时未进行new操作,称为懒汉式
*/
private static SingleObject instance;
/**
* 单例对象只能有一个实例对象,所以不能被创建对象,故将构造方法设为私有
*/
private SingleObject(){}
/**
* getInstance是获取单例对象的方法
*/
private synchronized static SingleObject getInstance(){
if (instance == null){
instance = new SingleObject();
}
return instance;
}
}
2.饿汉式
public class SingleObject2 {
/**
* 在初始化对象时即进行实例化操作,不用担心多线程问题
*/
private static SingleObject2 instance = new SingleObject2();
/**
* 私有化构造方法
*/
private SingleObject2(){}
public SingleObject2 getInstance(){
return instance;
}
}
3.双重校验锁(double-checked locking):是懒汉式的一种升级
public class SingleObject3 {
/**
* 初始化对象
*/
private static SingleObject3 instance = null;
/**
* 私有化构造
*/
private SingleObject3(){}
public SingleObject3 getInstance(){
//第一次判空
if (instance == null){
//同步锁锁住Class对象,进入临界区
synchronized (SingleObject3.class){
//第二次判空,保证只会有一个实例化对象
if (instance == null){
instance = new SingleObject3();
}
}
}
return instance;
}
}
4.静态内部类