单例模式(Singleton pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:
(1)某个类只能有一个实例;
(2)它必须自行创建这个实例;
(3)它必须自行向整个系统提供这个实例。
/**饿汉式单例模式
**由于在定义静态变量的时候实例化单例类
**因此在类加载的时候就已经创建了单例对象
*
**该模式下不存在线程安全问题
* @author ThinkPad
*
*/
public class EagerSingleton {
//1、静态私有成员变量
private static final EagerSingleton INSTANCE = new EagerSingleton();
//2、构造函数私有
private EagerSingleton() {}
//3、公有静态工厂方法
public EagerSingleton getInstance() {
return INSTANCE;
}
}
/**懒汉式
**这种方式存在线程安全问题
**在多线程下,有可能创建多个实例
*
* @author ThinkPad
*
*/
public class LazySingleton1 {
//1、静态私有变量
private static LazySingleton1 instance = null;
//2、构造函数私有
private LazySingleton1() {}
//3、公有静态工厂方法
public static LazySingleton1 getInstance() {
//(1)线程不安全的方式
//if(instance == null) {
// instance = new LazySingleton1();
//}
//(2)线程安全的方式
if(instance == null) {
synchronized (LazySingleton1.class) {
if(instance == null) {
instance = new LazySingleton1();
}
}
}
return instance;
}
}
/**懒汉式线程安全的实现方式2
**利用静态内部类实现
* @author ThinkPad
*
*/
public class LazySingleton2 {
//构造器私有化
private LazySingleton2() {}
//静态内部类,只加载一次
private static class Inner{
private static final LazySingleton2 INSTANCE = new LazySingleton2();
}
//公有静态工厂方法
public static LazySingleton2 getInsatnce() {
return Inner.INSTANCE;
}
}
单例模式适用环境:
(1)系统只需要一个实例对象;
单例模式应用:
(1)JDK中的java.lang.Runtime类;
(2)Spring中,默认通过单例模式进行创建:
<bean id = “date” class = “java.util.Date” scope = ”singleton”/>
单例模式也是java面试中最常见的面试题,一定要熟练的手写出来。