介绍
官方定义
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)
举个最常见的例子,Spring 中的 bean 默认都是单例模式,每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例
单例模式八种实现方式
-
饿汉式(静态常量)
-
饿汉式(静态代码块)
-
懒汉式(线程不安全)
-
懒汉式(线程安全,同步方法)
-
懒汉式(线程安全,同步代码块)
-
双重检查
-
静态内部类
-
枚举方式
饿汉式(静态常量)
class Singleton{
//一:构造器的私有化 防止外部用构造器...
private Singleton(){}
//二:类的内部创建对象 final static
private static final Singleton singleton = new Singleton();
//三:对外提供公共的静态方法 返回该类唯一的对象实例
public static Singleton getInstance(){
return singleton;
}
}
优点: 简单 避免多线程的同步问题
缺点:没有达到懒加载的效果 内存的浪费
饿汉式(静态代码块)
class Singleton{
//构造器私有化
private Singleton(){}
//类的内部创建对象
private static final Singleton singleton;
static {
singleton = new Singleton();
}
//对外提供公共的静态的方法
public static Singleton getInstance(){
return singleton;
}
}
优点: 简单 避免多线程的同步问题
缺点:没有达到懒加载的效果 内存的浪费
懒汉式(线程不安全)
class Singleton{
//构造器私有化
private Singleton(){}
//类的内部提供对象
private static Singleton singleton;
//对外提供公共的静态方法的时候,来判断
public static Singleton getInstance(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
优点: 起到了懒加载的效果 不会造成内存浪费
缺点:线程不安全 不推荐这种方式的
懒汉式(同步方法)
class Singleton{
//构造器私有化
private Singleton(){}
//类的内部提供对象
private static Singleton singleton;
//对外提供公共的静态方法的时候,来判断
public static synchronized Singleton getInstance(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
优点: 起到了懒加载的效果 不会造成内存浪费,且线程安全
缺点:效率太低
懒汉式(同步代码块)
class Singleton{
//构造器私有化
private Singleton(){}
//类的内部提供对象
private static Singleton singleton;
//对外提供公共的静态方法的时候,来判断
public static Singleton getInstance(){
if (singleton == null){
synchronized (Singleton.class){ //失去了意义
singleton = new Singleton();
}
}
return singleton;
}
}
优点: 起到了懒加载的效果 不会造成内存浪费
缺点:解决不了线程的安全问题,不推荐
双重检查机制
class Singleton{
private Singleton(){}
private static Singleton singleton;
//加入双重检查机制
public static Singleton getInstance(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
优点: 起到了懒加载的效果 不会造成内存浪费,且线程安全,效率较高,推荐使用
缺点:
静态内部类
class Singleton{
private Singleton(){}
private static class SingletonInstance{
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}
优点: 利用静态内部类的特点,效率也很高,实际开发中推荐使用的
缺点:
枚举方式
enum Singleton{
INSTANCE; //属性
}
优点: 不仅可以避免线程安全问题 推荐大家使用
缺点:
单例模式的使用场景
-
对于一些需要频繁创建销毁的对象
-
重量级的对象
-
经常使用到的对象
-
工具类对象
-
数据源,session。。。。