单例模式介绍
单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现单例模式要求:
- 将构造方法私有化,杜绝使用构造器创建实例
- 需要自身创建唯一的一个实例,并提供一个全局访问入口
单例模式实现方式
- 懒汉式
- 是使用synchronized来进行加锁,从而保证线程安全,所以调用效率不高
- 延时加载,真正用的时候再创建
public class A {
private static A instance;
/**
*私有的构造方法
*/
private A(){}
/**
*唯一公开获取实例的方法(静态工厂方法),该方法使用synchronized加锁,来保证线程安全性
*/
public static synchronized A getInstance() {
if(instance == null) {
instance = new A();
}
}
}
- 饿汉式
- 是通过类加载机制来实现的,从而避免多线程同步问题,来达到线程安全,因是不需要加锁来线程安全,所以执行效率高
- 因是在类加载的时候就进行初始化,所以会造成一定内存浪费
public class A {
private static final A instance = new A();
/**
*私有的构造方法
*/
private A() {}
public static A getInstance(){
return instance;
}
}
- Double CheckLock实现单例
- DCL(Double CheckLock)也就是双重锁校验机制
- 使用了volatile来修饰符,来达到线程可见性(就是被一个线程修改之后,别的线程立即可见)
public class A {
/**
* 私有实例,volatile修饰的变量是具有可见性的(即被一个线程修改后,其他线程立即可见)
*/
private volatile static A instance;
/**
* 私有构造方法
*/
private A() {}
/**
* 唯一公开获取实例的方法(静态工厂方法)
*/
public static A getInstance(){
if(instance == null) {
synchronized(A.class) {
if(instance == null) {
instance = new A();
}
}
}
}
}
- 静态内部类或静态对象
利用了静态内部类延迟初始化的特性,来达到与双重校验锁方式一样的功能- 静态内部类
public class A {
/**
* 静态内部类
*/
private static class AInstance {
private static final A instance = new A();
}
/**
* 私有构造方法
*/
private A() {}
/**
* 唯一公开获取实例的方法(静态工厂方法)
*/
public static A getInstance() {
return AInstance.instance;
}
}
2. 静态内部对象
public class A {
/**
*静态内部对象
*/
private staic Object lock = new Object();
/**
* 私有实例
*/
private static A instance;
/**
* 私有构造方法
*/
private A() {}
/**
* 唯一公开获取实例的方法(静态工厂方法)
*/
public static A getInstance(){
if(instance == null) {
synchronized(lock) {
if(instance == null) {
instance = new A();
}
}
return instance;
}
}
}
- 枚举类
利用了枚举类的特性,不仅能避免线程同步问题,还防止反序列化重新创建新的对象。
public enum A {
//枚举元素本身就是单例
A;
//自定义的操作
public void method() {
...
}
}