【Java设计模式】单例模式
【博主声明】欢迎审阅,未经许可,请勿转载,谢谢!
设计模式相关文章
· 介绍
今天,我们来学习设计模式中最简单一种模式之一就是 —— 单例模式(singleton pattern) 。那么何为单例模式呢?它主要在程序中起到什么作用?为什么要使用这种模式以及它的模板代码?带着前面几个问题,我们一一解剖这个所谓的单例模式。
· 单例模式
单例,从命名的名词角度来解释,它的意思是单独的一个实例。没错,其实它就是这个意思。而在我们程序中,它也是仅仅存在的一个全局的实例,也就是实例化一次。它的创建只能通过自身来实例化,仅提供外部的一个唯一的访问自己的方法。
· 单例模式的特点:
1、仅有一个实例
2、自己实例化自己
3、提供一个唯一访问自身实例的方法
· 单例模式的作用:
保证自身的唯一性,以确保数据的准确、唯一。在多线程情况下,多次访问数据对其进行操作则会造成数据紊乱,而使用单例则能确保数据是准确了。
· 单例模式的实现方式:
单例模式的实现方式主要有4种,也是我们最经常写的几种,我们分别看它们的实现方式以及区别。
一、懒汉式(线程安全)
优点:使用时才实例化,避免内存开销。
缺点:synchronized关键字会导致效率降低。
/**
* @Created by xww.
* @Creation time 2018/8/14.
*/
public class Singleton {
private static Singleton instance;
public static synchronized Singleton getIns() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
二、饿汉式(线程安全)
优点:没有synchronized枷锁,效率提升。
缺点:在类转载时实例化,导致内存开销增大。
/**
* @Created by xww.
* @Creation time 2018/8/14.
*/
public class Singleton {
private static final Singleton instance = new Singleton();
public static Singleton getIns() {
return instance;
}
}
三、双重校验锁(线程安全)
优点:使用双重校验锁机制,在多线程中依然保持高效率,而且在使用时才实例化,综合以上两个优缺点于一身。
缺点:据说这是最推崇的一种单例写法,在安卓源码中也有这样写的,所以暂时不知道有什么缺点。
/**
* @Created by xww.
* @Creation time 2018/8/14.
*/
public class Singleton {
private volatile static Singleton instance;
public static Singleton getIns() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
四、静态内部类(线程安全)
优点:在使用时才实例化,综合以上两个优缺点于一身。与双重校验锁的方式相比,实现方式简单了点。
缺点:暂时不知道有什么缺点,应该逼格没有双重校验锁高吧。
/**
* @Created by xww.
* @Creation time 2018/8/14.
*/
public class Singleton {
private static class Holder {
private static final Singleton instance = new Singleton();
}
public static Singleton getIns() {
return Holder.instance;
}
}
五、枚举类(线程安全)
枚举类也是线程安全的,它最简洁,是单例模式的最佳方式,支持序列化机制,防止被多次的实例化。
· 单例模式的使用方式比较:
一般建议使用饿汉式,不建议使用懒汉式。
如果在类装载过于耗时的处理时,使用静态内部类方式,要用才实例化,也可以用双重校验锁方式。
如果需要反序列化,用枚举类的方式。
©原文链接:https://blog.csdn.net/smile_Running/article/details/81676402
@作者博客:_Xu2WeI
@更多博文:查看作者的更多博文
上一篇: Java设计模式之——单例模式
下一篇: 模版方法模式
推荐阅读
-
代码评审 博客分类: 敏捷/设计/模式工作随记 代码评审code review
-
JAVA设计模式之访问者模式原理与用法详解
-
Java 的双重分发与 Visitor 模式实例详解
-
学习php设计模式 php实现策略模式(strategy)_PHP
-
PHP实现设计模式中的抽象工厂模式详解,设计模式详解
-
Java设计模式之策略模式_动力节点Java学院整理
-
学习php设计模式 php实现装饰器模式(decorator)_PHP
-
Java设计模式之备忘录模式_动力节点Java学院
-
设计模式:Abstract Factory模式
-
java 23 种设计模式-02-抽象工厂模式(abstract factory)